我正在使用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
答案 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" }
);