我正在尝试将自定义事件从我的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 =标志来检索此描述;请参阅帮助和支持以获取详细信以下信息是事件的一部分:事件日志文件已损坏..
我不确定我在这里缺少什么。我正在写出已经存在的完全相同的事件,但它仍然无法找到消息字符串。
答案 0 :(得分:1)
我也面临类似的问题。经过大量的研究后,我按照本文http://www.codeproject.com/Articles/4166/Using-MC-exe-message-resources-and-the-NT-event-lo验证了所有步骤,一切似乎已经到位。除了一件事......我偶然发现了这个msdn http://msdn.microsoft.com/en-us/library/windows/desktop/aa363661(v=vs.85).aspx
如上一段所述..'如果应用程序调用RegisterEventSource并传递在注册表中找不到的源名称,则事件日志记录服务默认使用应用程序日志。但是,由于没有消息文件,因此事件查看器无法将任何事件标识符或事件类别映射到描述字符串,并且将显示错误。因此,您应该为应用程序的注册表添加一个唯一的事件源,并指定一个消息文件。因此,我在RegisterEventSource中的应用程序名称与注册表中的应用程序名称不匹配。我修复了这个问题,现在它可以工作了......所以如果你遇到这个问题,请仔细检查你的注册表项。
答案 1 :(得分: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);