读取ETW TraceEvent,然后将其写回

时间:2018-09-06 22:01:37

标签: windows logging trace tracing etw

我正在编写一个处理Windows ETW事件的应用程序。

我的应用程序创建一个logman会话并配置要写入.etl日志文件的事件。

我的应用程序读取了这些.etl文件,对其进行处理,然后将其删除。

问题:此处理步骤可能会失败(请参见下面的代码)。

我需要一种将ETW事件写回.etl文件的机制,以便以后处理。

如何将Microsoft.Diagnostics.Tracing.TraceEvent对象(通过DynamicTraceEventParser回调委托获得) back 写入磁盘(理想情况下,返回到.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(); 
    }
}

0 个答案:

没有答案