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" }
);