Чтение циклического файла журнала ETW с помощью ETWTraceEventSource

Краткая версия. Почему 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).

Помощь!!!


person Phil Lambert    schedule 18.03.2015    source источник
comment
Надеюсь, @mjsabby снова придет мне на помощь! :)   -  person Phil Lambert    schedule 20.03.2015


Ответы (1)


Как один из разработчиков библиотеки Tx (LINQ to logs and traces), я бы рекомендовал использовать ее официальную LINQpad для запроса файлов etl. Эта документация должна стать хорошим началом для тебя. И, черт возьми, вы можете просто интегрировать его с вашим приложением Windforms.

Другим вариантом может быть использование инструмента SvcPerf, который является средством просмотра ETW E2E, созданным поверх Tx, поэтому у вас нет вообще написать свой инструмент.

В обоих случаях вам просто нужны файлы etl и manifest.

В вашем конкретном случае я думаю, что проблема заключалась в следующем: динамический обработчик может дестерилизировать полезную нагрузку фактических событий, но сначала ему нужно прочитать манифест из сеанса. Я бы проверил, на месте ли манифест и нет ли диагностических ошибок в потоке ETW, испускаемом самим EventSource.

person Sergey Baranchenkov    schedule 15.04.2015