将ETW事件发送到全局“应用程序”日志

时间:2013-10-27 04:26:26

标签: c++ windows winapi events etw

我想让我的应用程序在Windows事件查看器中对全局“应用程序”日志显示警告和错误。我已经成功地遵循了帮助我启动并运行ETW的方向here,但是当我通过跟踪程序显式启用日志记录时,我只看到事件,即使这样,它们也只显示在生成的.etl文件中,不在全局日志中。

如何以编程方式向全局应用程序日志注册和写入事件,以便当用户运行事件查看器时,他们会看到我的应用程序中的事件?它甚至可能吗?简而言之,我想最终得到类似下面的截图,只需要更少的photoshopping:

enter image description here

1 个答案:

答案 0 :(得分:2)

ETW似乎非常复杂,这是写入事件日志的过程:

a)一次性(通常在安装应用程序时执行此操作)Register your application as a Event Provider;只需要EventMessageFile条目:
- key = HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ eventlog \ Application \ MyCoolGame
- 字符串名称(REG_EXPAND_SZ)= EventMessageFile
- 字符串值= C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ EventLogMessages.dll

b)在程序启动时:Register Event Source并收到一个句柄:

hEventLog = RegisterEventSource(NULL, lpszAppNameName);

c)使用ReportEvent function将条目写入事件日志:

TCHAR szLogBuffer[] = _T("Started new multiplayer server.");
const TCHAR *lpszEventStrings[2] = {szLogBuffer, NULL};
ReportEvent(hEventLog, EVENTLOG_INFORMATION_TYPE, 0, 1, NULL, 1, 0, lpszEventStrings, NULL)

d)程序关闭时:

DeregisterEventSource(hEventLog);