Краткая версия. Почему ETWTraceEventSource возвращает 0 записей журнала для циклического файла журнала размером 100 МБ?
Длинная версия. Я изменил приложение IIS, чтобы использовать ведение журнала ETW (с помощью пакета nuget). Мой источник событий выглядит так: -
[EventSource(Name = "MyEtwLog")]
public class MyEtwSource : EventSource
{
[Event(1, Level = EventLevel.Verbose)]
public void Debug(string message) { WriteEvent(1, message); }
[Event(2, Level = EventLevel.Informational)]
public void Info(string message) { WriteEvent(2, message); }
[Event(3, Level = EventLevel.Warning)]
public void Warn(string message) { WriteEvent(3, message); }
[Event(4, Level = EventLevel.Error)]
public void Error(string message) { WriteEvent(4, message); }
[Event(5, Level = EventLevel.Critical)]
public void Fatal(string message) { WriteEvent(5, message); }
}
И у меня есть сеанс для включения провайдера, который выглядит так: -
TraceEventSession _etwSession = new TraceEventSession(
"MyEtwLog", @"C:\Logs\MyEtwLog.etl") { CircularBufferMB = 100 };
etwSession.EnableProvider(
TraceEventProviders.GetEventSourceGuidFromName("MyEtwLog"),
TraceEventLevel.Always);
Все материалы IIS работают нормально. Меня попросили написать приложение winforms для просмотра этих журналов (пользователям не нравится PerfView), поэтому у меня есть этот код: -
using (ETWTraceEventSource source = new ETWTraceEventSource(@"C:\Logs\MyEtwLog.etl"))
{
source.Dynamic.All += arg =>
{
// Process log entry
}
source.Process();
}
Пользователь создал 10 таких журналов, и на его машине (Windows 8.1) 8 из них отлично загружаются в приложение. Остальные 2 имеют размер 100 МБ и не показывают записей в журнале. Если я открою их в PerfView, я увижу, что с файлом все в порядке, и все записи в журнале есть.
Отлаживая их на своей машине (также Windows 8.1), я никогда не попадал в код «Запись журнала процессов». После множества проб и ошибок я понял, что использование AllEvents вместо Dynamic.All работает: -
source.AllEvents += arg =>
{
// Log entries, woo!!!
}
Я проверил, что это отлично работает на моей тестовой машине (Windows 7), но когда я передаю приложение обратно пользователю, я получаю точно такую же проблему! Я также воспроизвел это на машине с Windows 2008 R2 (.net 4.5.2) и на машине с Windows 7 (.net 4.5.1).
Помощь!!!