首页 > 解决方案 > 读取 ETW TraceEvent,然后将其写回

问题描述

我正在编写一个处理 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(); 
    }
}

标签: windowsloggingtraceetw

解决方案


推荐阅读