系统如何.诊断.追踪.EventSource.IsEnabled工作



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

[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。

似乎需要将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的文档真的很糟糕。

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

如果具有大于或等于"level"且具有已启用"keywords"集合的个。

请注意,此函数的结果只是无论特定事件是否处于活动状态。它只是注定的用于在日志记录时避免昂贵的日志计算未打开,因此有时会返回误报(但当返回false时总是准确的(。EventSources是免费的额外过滤。

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

@汉斯是对的。我忽略了指出,您需要开始收集事件才能启用它们。您可以通过编程或使用一系列工具(如PerfView(来完成此操作。

最新更新