0

我正在使用 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 名称硬编码为属性,而只需使用可用的重载构造函数并将我的名称传递给构造函数。

我从以前的帖子中找到了一些有用的信息,但遗憾的是没有解决我的问题 使用 EventSource 记录 ETW 丢失事件的风险

4

1 回答 1

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" }
    );
于 2017-10-11T20:56:47.300 回答