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

时间:2018-07-31 10:35:19

标签: c# .net tracing etw

使用自定义事件源时,例如:

[EventSource(Name = "MyEventSource")]
public partial class CustomEventSource : EventSource
{
}

EventSource类上有一个IsEnabled方法:

EventSource.IsEnabled(eventLevel, eventKeywords)

https://msdn.microsoft.com/en-us/library/hh393402(v=vs.110).aspx

此方法如何确定事件的级别和关键字是否为“已启用”?似乎没有任何可靠的文档。在我的实现中,该方法返回false,但我不确定要使其返回true需要做什么。

2 个答案:

答案 0 :(得分:1)

来自公开bool IsEnabled(EventLevel level, EventKeywords keywords)的源代码:

  

如果事件具有大于或等于“级别”并且具有一个   启用了“关键字”设置。

     

请注意,此函数的结果仅近似于   特定事件是否处于活动状态。它只是为了   用作避免在记录时进行昂贵的记录计算的方法   尚未启用,因此有时会返回误报(但   返回false时始终准确)。 EventSources是免费的   附加过滤。

请注意,错误的回报是准确的,因此您需要查看自己的水平和关键字。

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

答案 1 :(得分:1)

似乎您需要将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
}

编辑:

我还发现了EvenSource.SendCommand方法,该方法可以将EventCommand.Enable作为参数,但是只会为我抛出ArgumentException。是的,EventSource的文档确实很糟糕。