Я пишу приложение, обрабатывающее события Windows ETW.
Мое приложение создает сеанс logman и настраивает события, которые будут записаны в .etl
файлы журнала.
Мое приложение считывает эти .etl
файлы, обрабатывает их и затем удаляет файл.
Проблема: возможно, что этот этап обработки не выполнен (см. Код ниже).
Мне нужен механизм для записи событий ETW в файл .etl, который будет обработан позже.
Как записать объект Microsoft.Diagnostics.Tracing.TraceEvent
(полученный с помощью DynamicTraceEventParser
делегата обратного вызова) обратно на диск (в идеале, обратно в файл .etl
?)
Решения, которые приходят на ум:
- Запись неудачных событий обратно в файл
.etl
- это желаемое решение
- Просто сохраните весь файл событий в случае каких-либо отдельных ошибок при обработке событий, и пусть успешные записи будут обработаны дважды. - К сожалению, наша операция обработки не идемпотентна, поэтому это не сработает. (Мы не можем допустить, чтобы записи обрабатывались дважды)
- Запишите событие обратно в хранилище событий 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();
}
}