windows - 读取 ETW TraceEvent,然后将其写回
问题描述
我正在编写一个处理 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();
}
}
解决方案
推荐阅读
- python-3.x - @ 在 Python 3 中的函数上方是什么意思?
- windows - 在 Windows 上使用 MinGW 进行 Clang
- django - Django 视图函数跳过 urls 关键字
- api - Postwoman API Tester 响应始终为空
- javascript - 使用 Webpack 4 渲染 SVG 图标时出现问题
- google-cloud-firestore - 如何获取任何 Firestore 查询的最后一页?
- javascript - Quick.DB 在 Discord 中添加标签问题 - Discord.JS
- windows - 我可以使用 .gitignore 或 .git/info/exclude 来阻止特定用户拉/推被认为对他们“限制”的文件吗?
- sql - 每行的最大日期
- android - 如何检查 android Espresso 中活动的 API 响应?