从源找不到事件ID的说明
当我在Windows事件日志中写入日志时,我收到以下事件,此消息的根本原因是什么,如何解决? 非常感谢
无法find源RRWS中事件ID 51001的说明。 引发此事件的组件未在本地计算机上安装,或者安装已损坏。 您可以在本地计算机上安装或修复组件。
如果事件发生在另一台计算机上,显示信息必须与事件一起保存。
活动中包含以下信息:
testing日志messge
消息资源存在但消息未在string/消息表中find
在使用“EventCreate”从命令行创build应用程序日志下的事件源后,出现此错误。 此命令将在下创build一个新的项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
如果您查看已创build的密钥(例如SourceTest),将会有一个名为EventMessageFile
的string值,对于我来说,它被设置为%SystemRoot%\System32\EventCreate.exe
。
将其更改为c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll
删除CustomSource
和TypesSupported
值。
这应该停止“事件ID ….的描述”消息。
您需要为其创build事件源和消息文件。 代码看起来像这样:
var data = new EventSourceCreationData("yourApp", "Application"); data.MessageResourceFile = pathToYourMessageFile; EventLog.CreateEventSource(data);
那么你将需要创build一个消息文件 。 这篇文章也解释了一些事情(我没有看完但是看起来相当完整)。
我的一个朋友有完全相同的问题。 他尝试了所有描述的选项,但似乎没有任何工作。 经过很多研究, 也是对微软的描述 ,他总结说要重启系统。
似乎操作系统无法刷新已注册事件源的列表。 只有重新启动后,事件源才能正确注册。
结论: 重新启动您的系统!
我也面临类似的问题。 经过大量的研究,我做了下面的工作,根据这篇文章validation了这些步骤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并传递在registry中找不到的源名称,则事件logging服务默认使用应用程序日志。 但是,由于没有消息文件,事件查看器无法将任何事件标识符或事件类别映射到描述string,并会显示错误。 因此,应该为registry添加一个唯一的事件源,并指定一个消息文件。 所以我在RegisterEventSource中的应用程序名称与registry中的应用程序名称不匹配。 我解决了这个问题,现在它工作…所以,如果你面对这个问题,请仔细检查你的registry项。
使用PowerShell创build事件日志和来源:
New-EventLog -LogName MyApplicationLog ` -Source MySource ` -MessageResourceFile C:\windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll
你需要消息DLL来避免你所看到的问题。
对我来说,问题是我偶然的目标configuration文件被设置为“.Net Framework 4客户端configuration文件”。 当我使用“.Net Framework 4”重build有问题的服务时,问题就消失了!
我也偶然发现了这个问题 – 尽pipe是由另一种可能性引起的:事件标识符(在#define
被“模糊化”)将严重性设置为错误 ( 事件标识符中所述的两个高位)。 当事件查看器显示事件标识符(低位16位)时,可能无法匹配…
作为参考,我在自己的研究中编写了一套提示,同时进行故障排除和修复:
-
如果您的日志条目没有以“ 消息资源存在但消息在string/消息表中找不到 ”(与原始问题相反)结束:
- 意味着你缺lessregistry信息
- 仔细检查事件源名称和registry项
-
如果您需要添加/编辑registry信息,请记住:
- 重新启动事件查看器 (如KB166902的第 6 项以及@JotaBe所述)
- 如果没有帮助,重新启动Windows事件日志 / 事件日志服务(或重新启动系统,由@BrunoBieri暗示)。
-
如果您不希望创build自定义DLL资源,请注意常用的事件消息文件有一些注意事项:
- 他们拥有大量的标识符,试图覆盖大多数情况
- .NET的
EventLogMessages.dll
(由@Matt暗示)上升到0xFFFF
- Windows
EventCreate.exe
“唯一”上升到0x3E9
- .NET的
- 每个条目都包含
%1
- 这意味着只会显示 第一个string
- 所有传递给
ReportEvent
string仍然可以通过查看事件详细信息进行检查(select所需的事件,转到“ 详细信息”选项卡并展开EventData )
- 他们拥有大量的标识符,试图覆盖大多数情况
-
如果您在logging的事件中仍然 “ 无法find ”(原始问题):
- 仔细检查正在使用的事件标识符值 (在我的情况下,它是事件标识符的限定符部分)
- 比较事件的详细信息(select所需的事件,去详细信息选项卡,并展开系统 )与一个工作的例子
如何真正的世界的解决scheme。
如果你所需要的只是一种“快速和肮脏”的方式来写一些东西到事件日志而不注册“自定义源”(需要pipe理员权限),或提供“消息文件”(需要工作和头痛),只需要这样做:
EventLog.WriteEntry( ".NET Runtime", //magic "Your error message goes here!!", EventLogEntryType.Warning, 1000); //magic
通过这种方式,您将写入现有的“应用程序”日志,而不会感到烦恼“无法find事件ID 0的说明”
如果你想“魔术”部分解释我在这里博客
这通常是由写入事件日志的程序引起的,然后被卸载或移动。
如果您在创build事件源之前打开“事件日志”查看器,例如安装服务时,您将看到该错误消息。 您不需要重新启动操作系统:只需closures并打开事件查看器即可。
注:我不提供自定义消息文件。 事件源的创build使用默认configuration, 如Matt的答案所示 。