我试图从我的web应用程序写入到Windows事件日志的自定义事件。 我没有运气得到消息string的工作,我不断收到“源Y中的事件ID X描述无法find”。
为了缩小这个范围,我决定写一个事件给我的机器上已经存在的源。 我只看了一个已经写出来的事件,特别是SceCli事件1704。
我执行下面的代码:
var log = new EventLog("Application"); log.Source = "SceCli"; var ev = new EventInstance(1704, 0, EventLogEntryType.Information); log.WriteEvent(ev);
但是,这仍然给我以下在事件查看器中:
源(SceCli)中的事件ID(1704)的说明找不到。 本地计算机可能没有必要的registry信息或消息DLL文件来显示来自远程计算机的消息。 您可能能够使用/ AUXSOURCE =标志来检索此说明; 详细信息请参阅帮助和支持。 以下信息是事件的一部分:事件日志文件已损坏。
我不知道我在这里错过了什么。 我正在写出已经存在的完全相同的事件,但它仍然无法find消息string。
我也面临类似的问题。 经过大量的研究,我做了下面的工作,根据这篇文章验证了这些步骤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中的应用程序名称与注册表中的应用程序名称不匹配。 我解决了这个问题,现在它工作…所以,如果你面对这个问题,请仔细检查你的注册表项。
你能看到其他事件吗? 很可能你无法使用特定的源和事件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);