ETW:设置EventSource名称产生EventId 806/807

时间:2017-10-03 18:52:58

标签: .net logging etw etw-eventsource

我正在使用ETW。 我正在运行控制台日志。当我实例化我的EventSource以尝试将我的事件记录到日志文件时,我会收到806/807警告代码,并且我的日志不会持续存在。 (无论是否添加'EventSource'属性,都会生成这些警告。

但是,如果我使用默认构造函数,而不是传递我的事件源的名称并使用默认属性值,我的日志会按预期生成而不会发出警告

示例实施:

using Microsoft.Diagnostics.Tracing;

[EventSource(Name = "MyApi")]
public sealed class MyEventSource : EventSource
{
    public MyEventSource(string name):base(name){
    }

    private static readonly Lazy<MyEventSource> _instance = new Lazy<MyEventSource>(() => new MyEventSource());

    public static MyEventSource Log => _instance.Value;
...
}

理想情况下,我希望避免将我的EventSource名称硬编码为属性,只需使用可用的重载构造函数并将我的名称传递给构造函数。

我从以前的帖子中找到了一些有用的信息,但遗憾的是没有解决我的问题 Risk of missing events from ETW logging with EventSource

1 个答案:

答案 0 :(得分:1)

您可以使用EventSource v4.6中提供的动态定义事件。 https://blogs.msdn.microsoft.com/vancem/2015/10/02/dynamically-defined-events-in-eventsource-v4-6/

文章示例:

EventSource Logger = new EventSoruce("MinimalEventSource");

Logger.Write("Load", new { ImageBase=10L, Name="AFile.dll" } );

EventKeywords Loader = (EventKeywords)0x1;
Logger.Write("Load", 
    new EventSourceOptions() { Level = EventLevel.Warning, Keywords = Loader }, 
    new { ImageBase = 10L, Name = "AFile.dll" }
    );