为什么在成功调用 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。
所以这里的问题是即使您的事件写入成功,您也无法在事件查看器中看到这些事件。这些事件错过了,因为您从未启动消费者来消费它们。
您可以像这样通过 ETW 登录 Windows Device Portal 找到它们:
有关如何使用事件的详细信息,请参阅 Consuming Events。
我找到了解决办法。
问题出在 mc utility 的跟踪会话和自动生成的代码中。
需要使用 -um 标志调用 mc 并使用自动生成的函数进行日志写入。
工作样本是 here
我有一个包含多个事件和两个通道的清单文件。 我通过 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。
所以这里的问题是即使您的事件写入成功,您也无法在事件查看器中看到这些事件。这些事件错过了,因为您从未启动消费者来消费它们。
您可以像这样通过 ETW 登录 Windows Device Portal 找到它们:
有关如何使用事件的详细信息,请参阅 Consuming Events。
我找到了解决办法。 问题出在 mc utility 的跟踪会话和自动生成的代码中。 需要使用 -um 标志调用 mc 并使用自动生成的函数进行日志写入。 工作样本是 here