最近在做一些性能优化的时候,发现很多应用经常会出现文件 I/O 爆高,但又没做啥事情。结果分析下来发现,都是在写日志。
于是就有了这么一篇,怎么利用 Windows 自己提供的 ETW 来记录应用日志。
ETW(Event trace for Windows) 是 Windows 提供的一种事件跟踪机制,可以用来记录应用程序的运行时事件。
ETW Provider 提供的日志相比文件日志,主要有以下优点:
作为普通应用程序,没法直接使用微软的标准库来做,这里会相对麻烦一点。但通过微软提供的一些工具,可以稍微提升一定的效率。
我们采取基于清单的方式来创建 provider。
我们可以通过 SDK 中自带的图形化工具(ecmangen.exe
)来生成清单文件。
如果你安装了 8.1 的 SDK,你可以在 C:\Program Files (x86)\Windows Kits\8.1\bin\x64\
找到它。
如果你没安装,可以在附件中下载到。
打开它,会得到一个这样的应用:

然后就可以开始创建 provider 了。
选择【Events Section】部分,右击,选择【New】-【Provider】
根据提示,填写好 Name
、Symbol
、GUID
(可以自动生成一个)、Decoding file locations
(这个可以后面再进行修改的)
如下图所示:

下一步,我们就要开始创建我们的 event 了。开始 Event 之前,我们需要先创建一些关键属性处理,以方便 Event 创建的时候进行选择。
关于基础属性,详细介绍可以看:ETW:Windows 事件追踪
这里,我们需要创建或修改的有:

还有额外的一些属性可以按需使用。
关键就是创建 Event 了,这是对日志的直接表达。
需要定义 Symbol、EventId、Event Version(主要用于版本管理)和一些基础属性,这个需要根据业务定义来。
如下是场景激活事件的事件详情,供参考。

然后按需完成事件的增加。满足需求后,通过【File】-【Save/Save As】将 man 文件保存即可。
于是我们就得到了我们的 xxx.man 清单文件。
创建完清单文件,接下来就可以通过清单文件生成宏信息,在代码中调用更方便。
这里需要用到 mc.exe
,可以通过 man 文件来生成 .h
、.rc
、.bin
文件。
mc.exe 是跟随 win10 的 SDK 带下来的。
于是,我们就可以创建 VS 项目,然后引入 .h 和 .rc 进行使用了。
这里需要把 .h 和 .rc 和 bin 文件加到项目中。
然后,就可以开始写代码了。.h 中有了较多的宏,所以写起来也非常的方便。
直接放代码:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2025-3-25 09:30
被frendguo编辑
,原因: 添加附件