为什么在成功调用 EventWrite 函数后我的 windows 日志为空

Why I have empty windows logs after success EventWrite function call

我有一个包含多个事件和两个通道的清单文件。 我通过 mc 命令生成包含和资源文件:

mc -um manifest.man

我link资源文件进入应用程序。

我通过 wevtutil 命令在系统中安装清单:

wevtutil.exe im manifest.man

在应用中我使用EventRegister来初始化日志,使用EventWrite来写入日志。 生成日志事件的下一个代码return ERROR_SUCCESS: EVENT_DATA_DESCRIPTOR 数据;

 ULONG writeEvent(const std::string& message){
   std::string log_message_str( message );
   EVENT_DATA_DESCRIPTOR data;
   EVENT_DESCRIPTOR description;
   EventDataDescCreate( &data, message.c_str(), static_cast<ULONG>(log_message_str.size() + 1) );

   return EventWrite(log_handle, &description, 1, &data);
 }

另外,我授予我的 LocalService 应用程序读取权限:

icacls "service_win.exe" /grant "NT AUTHORITY\LocalService":R /Q

我使用 'NT AUTHORITY\LocalService' 帐户启动我的应用程序,例如服务:

sc.exe create service_win binpath=D:\service_win.exe type=own obj='NT AUTHORITY\LocalService'
net start service_win

我在 manifest.man 中声明的频道已添加到 WinEvents 日志中,但为空。 在应用程序中,我每隔一秒通过 writeEvent 写入日志,结果为 ERROR_SUCCESS,但我的日志文件仍然是空的。

更新:

我创建 github repo 带有重现步骤

您正在使用 Event Tracing 技术。它需要提供者创建事件和消费者消费事件。

如果您想通过事件查看器查看事件,您可以参考Using Event Logging

所以这里的问题是即使您的事件写入成功,您也无法在事件查看器中看到这些事件。这些事件错​​过了,因为您从未启动消费者来消费它们。

参考Events lost reasons.

您可以像这样通过 ETW 登录 Windows Device Portal 找到它们:

有关如何使用事件的详细信息,请参阅 Consuming Events

我找到了解决办法。 问题出在 mc utility 的跟踪会话和自动生成的代码中。 需要使用 -um 标志调用 mc 并使用自动生成的函数进行日志写入。 工作样本是 here