使用C++在Windows上记录事件查看器日志

10

我想在我的C++应用程序中使用日志。然而,我想使用Windows(10)事件查看器,而不是文本文件。我发现了一些奇怪的调用,甚至不知道参数的含义- ReportEventOpenEventLog和其他一些事件记录功能。由于我的应用程序存在某些限制,我也不能使用托管代码。

我还尝试了这个链接上的代码,但我得到了编译错误(命名空间“System”未定义-似乎缺少一些包含文件...)。

我还没有找到一个可行的示例代码。

如果可能的话,我会很感激提供一个示例代码-仅从非托管C++中构建的本地应用程序进行简单的日志记录。有人可以帮忙吗?


2
一旦你看到“System”命名空间,就进入了托管代码的领域,可以停止寻找非托管代码示例。 - user4581301
2
真的,这不是离题。虽然它很广泛,但它正在寻求有关Windows特定组件的帮助。 - Donnie
3
没错,但公平地说,C++在MSDN上的事件记录文档非常晦涩难懂。我第一次也感到很吓人。 - Donnie
2
你是什么意思?我已经发布了我正在寻找的函数,我说过我不理解这些参数。我还发布了我阅读过的页面。我的问题非常明确和直接,关于一个在API文档中没有很好记录的主题 - 有很多参数,可以用NULL或零来替换,但我不知道... - Leonardo Alves Machado
3
我曾试着自己记录Windows中的事件,现在我可以说我完全理解为什么没有最小可测试代码:几天后,我毫无头绪。这个问题是非常准确的,但被忽略了;我感到很沮丧。 - jmgonet
显示剩余4条评论
1个回答

17

你的链接编译不通过,因为它是托管 C++(请注意使用了gcnew)。

如果你只想写字符串,很容易,你只需要使用RegisterEventSourceReportEvent

大致上是这样:

const char* custom_log_name = "MyLogName";

// create registry keys for ACLing described on MSDN: http://msdn2.microsoft.com/en-us/library/aa363648.aspx

HANDLE event_log = RegisterEventSource(NULL, custom_log_name);
const char* message = "I'm in an event log";
ReportEvent(event_log, EVENTLOG_SUCCESS, 0, 0, NULL, 1, 0, &message, NULL);

这只允许记录字符串。更复杂(和有用)的日志记录是可能的,但在纯C++中需要投入相当大的精力。如果您可以为日志记录组件编写托管代码,则处理会变得更加容易。


1
在我的情况下,我需要编写 LPCWSTR custom_log_name = L"MyLogName";LPCWSTR message = L"I'm in an event log"; 而不是 const char* - Alexander Tumanin
2
谢谢,这确实有效,但是写入了Windows日志/应用程序。 有什么办法可以写入“应用程序和服务日志/MyCompany/MyApplication/Operation”吗? - Paulus
谢谢。我知道肯定有其他方法,而不是定义和编译清单之类的琐事。现在只需要找出默认类别和事件ID常量的位置。它们肯定存在某个地方... - undefined
嗯,问题是,至少在这台机器上(win11),字符串被记录了,但只有当您深入查看条目的详细信息时才能看到。主要的“常规”选项卡显示“操作成功完成。”,因为它使用FormatMessage()从事件ID(0 = 无错误)获取字符串。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接