Прочитайте ETW TraceEvent, а затем запишите его обратно - PullRequest
0 голосов
/ 07 сентября 2018

Я пишу приложение, обрабатывающее события Windows ETW.

Мое приложение создает сеанс logman и настраивает события, которые будут записаны в .etl файлы журнала.

Мое приложение считывает эти .etl файлы, обрабатывает их и затем удаляет файл.

Проблема: возможно, что этот этап обработки не выполнен (см. Код ниже).

Мне нужен механизм для записи событий ETW в файл .etl, который будет обработан позже.

Как записать объект Microsoft.Diagnostics.Tracing.TraceEvent (полученный с помощью DynamicTraceEventParser делегата обратного вызова) обратно на диск (в идеале, обратно в файл .etl?)

Решения, которые приходят на ум:

  1. Запись неудачных событий обратно в файл .etl - это желаемое решение
  2. Просто сохраните весь файл событий в случае каких-либо отдельных ошибок при обработке событий, и пусть успешные записи будут обработаны дважды. - К сожалению, наша операция обработки не идемпотентна, поэтому это не сработает. (Мы не можем допустить, чтобы записи обрабатывались дважды)
  3. Запишите событие обратно в хранилище событий ETW - я открыт для этого, но предпочел бы вариант 1

(упрощенный) код:

// For each .etl file
foreach (string fullFileName in eventFileNames)
{
    // Load the .etl file
    using (var source = new ETWTraceEventSource(fileFullName))
    {
        var parser = new DynamicTraceEventParser(source);
        parser.All += delegate (TraceEvent traceEvent)
        {
            bool proccessingSucceeded = ProcessEvent(traceEvent); // Processing code that can fail
            if (!proccessingSucceeded) 
            {
                // TODO: figure out a way to write this event back to disk (.etl file) to be processed later
            }
        };
        source.Process(); 
    }
}
...