4

我正在尝试将自定义事件从我的 Web 应用程序写入 Windows 事件日志。我没有让消息字符串正常工作,我不断收到“无法找到源 Y 中事件 ID X 的描述”。

为了缩小这个范围,我决定将一个事件写到我机器上已经存在的源中。我只是查看了已经写出的事件之一,特别是 SceCli 事件 1704。

我执行以下代码:

var log = new EventLog("Application");
log.Source = "SceCli";

var ev = new EventInstance(1704, 0, EventLogEntryType.Information);
log.WriteEvent(ev);

但是,这仍然在事件查看器中为我提供了以下信息:

找不到源 (SceCli) 中事件 ID (1704) 的描述。本地计算机可能没有必要的注册表信息或消息 DLL 文件来显示来自远程计算机的消息。您可以使用 /AUXSOURCE= 标志来检索此描述;有关详细信息,请参阅帮助和支持。以下信息是事件的一部分:事件日志文件已损坏。

我不确定我在这里缺少什么。我正在写出已经存在的完全相同的事件,但它仍然找不到消息字符串。

4

2 回答 2

2

我也面临类似的问题。经过大量研究后,我按照本文验证了步骤http://www.codeproject.com/Articles/4166/Using-MC-exe-message-resources-and-the-NT-event-lo Everything似乎就位。除了一件事..当我偶然发现这个 msdn http://msdn.microsoft.com/en-us/library/windows/desktop/aa363661(v=vs.85).aspx时,我意识到了这一点

正如最后一段所说..'如果应用程序调用 RegisterEventSource 并传递在注册表中找不到的源名称,则事件记录服务默认使用应用程序日志。但是,由于没有消息文件,事件查看器无法将任何事件标识符或事件类别映射到描述字符串,并且会显示错误。出于这个原因,您应该为您的应用程序添加一个唯一的事件源到注册表并指定一个消息文件。所以我在 RegisterEventSource 中的应用程序名称与注册表中的应用程序名称不匹配。我解决了这个问题,现在它可以工作了......所以如果你遇到这个问题,请仔细检查你的注册表项。

于 2013-09-17T13:21:42.387 回答
0

你能正确地看到其他事件吗?很可能您无法使用该特定源和事件 ID (SceCli/1704),因为 C# 事件类没有提供正确数量的参数来匹配事件消息文件中的事件模板。我认为它只适用于事件消息文件中只有“%1”的源(有关详细信息,请参阅http://www.eventid.net/show-DocId-22.htm )。

无论如何,我认为您需要为您的自定义应用程序创建一个源(如果它不存在),然后记录日志条目。在记录事件之前检查源是否存在,如果不存在则创建它:

if (!EventLog.SourceExists("MyWebApp"))
         EventLog.CreateEventSource("MyWebApp", "Application");
EventLog.WriteEntry("MyWebApp", "Some message", EventLogEntryType.Information, 1704);
于 2013-06-16T14:03:51.177 回答