System.Diagnostics.Tracing.EventSource.IsEnabled如何工作?

5
当使用自定义事件源时,例如:
[EventSource(Name = "MyEventSource")]
public partial class CustomEventSource : EventSource
{
}
类中有一个方法:
EventSource.IsEnabled(eventLevel, eventKeywords)

该方法如何确定事件是否对级别和关键字“启用”?似乎没有任何可靠的文档说明。在我的实现中,该方法返回false,我不确定需要做什么才能使其返回true。详情请查看:https://msdn.microsoft.com/en-us/library/hh393402(v=vs.110).aspx

这需要两个人来跳探戈,事件源和事件监听器。只有在有人表现出对事件的兴趣时,源才会开始工作。如果监听器是一个 .net 程序,那么你可以使用 EventListener.EnableEvents()。或者例如使用 Windows 的 logman.exe 实用程序来 创建数据收集器,首先尝试一下。 - Hans Passant
2个回答

2

看起来你需要将一个EventListener附加到你的EventSource上以启用它:

class CustomEventListener : EventListener
{
    protected override void OnEventWritten(EventWrittenEventArgs eventData)
    {
    }
}

void Main() 
{
    var src = new CustomEventSource();
    var listener = new CustomEventListener();
    Console.WriteLine(src.IsEnabled(EventLevel.LogAlways, EventKeywords.None)); // false
    listener.EnableEvents(src, EventLevel.Error);

    Console.WriteLine(src.IsEnabled(EventLevel.LogAlways, EventKeywords.None)); // true
    Console.WriteLine(src.IsEnabled(EventLevel.Critical, EventKeywords.None)); // true
    Console.WriteLine(src.IsEnabled(EventLevel.Verbose, EventKeywords.None)); // false
}

编辑:

我还发现了EventSource.SendCommand方法,它可以将EventCommand.Enable作为参数传入,但对我来说只会抛出一个ArgumentException。是的,EventSource的文档确实很糟糕。


1

从公共源代码中的bool IsEnabled(EventLevel level, EventKeywords keywords)函数:

如果事件的级别大于等于'level'并且其中一个“关键字”设置为已启用,则返回true。

请注意,此函数的结果仅是关于特定事件是否活动的近似值。它只是用作避免在未记录日志时进行昂贵计算的方法,因此有时会返回错误的正面结果(但在返回false时始终准确)。EventSources可以自由添加其他过滤器。

请注意,false返回值是准确的,因此您需要查看您的级别和关键字。

@Hans是正确的。我忽略了指出您需要开始收集事件以使其启用。您可以通过编程方式执行此操作,也可以利用一系列工具,例如PerfView。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接