ETW: установка имени EventSource приводит к EventId 806/807

Я использую 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 в качестве атрибута и просто использовать доступный перегруженный конструктор и передавать свое имя в конструктор.

Я нашел некоторую полезную информацию из предыдущего поста, но, к сожалению, не решил мои проблемы Риск пропущенных событий при ведении журнала ETW с EventSource

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" }
    );
Другие вопросы по тегам