2015-03-18 3 views
1

Краткая версия - Почему ETWTraceEventSource возвращает 0 записей журнала для файла журнала круговой записи 100 мб?Чтение циркулярного файла ETW с ETWTraceEventSource

Длинная версия - Я изменил приложение 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!!! 
} 

I подтвержден это прекрасно работает на моем компьютере (Windows 7), но когда я прохожу вернуть приложение к пользователь я получаю точно такую ​​же проблему! Я также воспроизвел это на машине Windows 2008 R2 (.net 4.5.2) и машине Windows 7 (.net 4.5.1).

Помощь !!!

+0

Надеюсь, @mjsabby снова приходит на помощь! :) –

ответ

1

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

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

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

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