当我写一个日志到 Windows 事件日志,我得到下面的事件,什么是这个消息的根本原因,我如何修复它?非常感谢
事件 ID51001的说明 无法找到来自源 RRWS。 要么是引发这个 事件没有安装在本地 计算机或安装是 已损坏。可以安装或修复 本地计算机上的组件。 如果事件起源于另一个 计算机,显示信息有 随着事件的发生而被保存。 其中包括以下信息 事件: 测试日志信息测试日志信息 消息资源是存在的,但 中找不到该消息 字符串/消息表
事件 ID51001的说明 无法找到来自源 RRWS。 要么是引发这个 事件没有安装在本地 计算机或安装是 已损坏。可以安装或修复 本地计算机上的组件。
如果事件起源于另一个 计算机,显示信息有 随着事件的发生而被保存。
其中包括以下信息 事件:
测试日志信息测试日志信息
消息资源是存在的,但 中找不到该消息 字符串/消息表
这通常是由于程序写入事件日志,然后卸载或移动。
您需要为它创建一个事件源和一个消息文件:
var data = new EventSourceCreationData("yourApp", "Application"); data.MessageResourceFile = pathToYourMessageFile; EventLog.CreateEventSource(data);
然后您需要创建一个 消息文件。还有这个 文章解释的东西(我没有读完它,但它似乎相当完整)。
在使用“ EventCreate”命令行在 ApplicationLog 下创建事件源之后,我得到了这个错误。 此命令在下面创建一个新键: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
如果您查看已经创建的 Key (例如 SourceTest) ,会看到一个名为 EventMessageFile的字符串值,对我来说它被设置为 %SystemRoot%\System32\EventCreate.exe。
EventMessageFile
%SystemRoot%\System32\EventCreate.exe
改成 c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll
删除 CustomSource和 TypesSupported值。
CustomSource
TypesSupported
这应该会停止“ The description for Event ID... .”消息。
我也遇到过类似的问题。在做了大量的研究后,我做了以下工作 我根据本文 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 中的应用程序名称与注册表中的应用程序名称不匹配。我修好了这个,现在可以用了。 因此,如果您遇到这个问题,请仔细检查您的注册表项。
使用 PowerShell 创建事件日志和源代码:
New-EventLog -LogName MyApplicationLog ` -Source MySource ` -MessageResourceFile C:\windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll
您需要使用消息 dll 来避免您看到的问题。
对我来说,问题是我的目标配置文件偶然被设置为“ .Net Framework 4 Client profile”。当我使用“ .Net Framework 4”重新构建有问题的服务时,问题就消失了!
重启你的系统!
我的一个朋友也有同样的问题。他尝试了所有描述的选项,但似乎都不起作用。经过多次研究,也是微软的描述,他得出结论,重新启动系统和它的工作! !
看起来操作系统并不是在所有情况下都会刷新已注册事件源的列表。只有在重新启动之后,才能确保事件源被正确注册。
如果在创建事件源之前打开事件日志查看器,例如在安装服务时,您将收到该错误消息。您不需要重新启动操作系统: 您只需要关闭并打开事件查看器。
注意: 我没有提供自定义消息文件。事件源的创建使用默认配置 就像马特的回答一样。
我也偶然发现了这一点——尽管还有另一种可能性: 事件标识符(在 #define中被“混淆”)正在将 严重性设置为 错误(事件标识符中所述的两个高阶位)。因为 事件查看器显示事件标识符(低阶16位) ,所以不可能有匹配..。
#define
作为参考,我根据自己的研究整合了一套技巧,同时解决了这个问题:
如果您的日志条目 没有以“ 消息资源存在,但在字符串/消息表中找不到该消息”结尾(与原问题相反) :
如果需要添加/编辑注册表信息,请记住:
EventLog
如果 不要希望创建自定义 DLL 资源,请注意通常可用的事件消息文件有一些警告:
EventLogMessages.dll
0xFFFF
EventCreate.exe
0x3E9
%1
ReportEvent
如果你的 还是在你记录的事件中得到“ 找不到”(原始问题) :
现实世界的解决方案怎么样。
如果你所需要的只是一种“快速而肮脏”的方式来写一些东西到事件日志 而不注册“自定义源”(需要管理权限) ,或者提供“消息文件”(需要工作和头痛) ,只需要这样做:
EventLog.WriteEntry( ".NET Runtime", //magic "Your error message goes here!!", EventLogEntryType.Warning, 1000); //magic
通过这种方式,您将向现有的“应用程序”日志写入,而不会出现恼人的“找不到事件 ID 0的描述”
如果你想解释“魔术”的一部分,我写了关于它 给你
在@Alex 的回答基础上,我提出以下建议:
using (EventLog eventLog = new EventLog("Application")) { //You cannot be sure if the current identity has permissions to register the event source. try { if (System.Web.HttpRuntime.AppDomainAppId != null) { eventLog.Source = System.Web.HttpRuntime.AppDomainAppId; } else { eventLog.Source = Process.GetCurrentProcess().ProcessName; } } catch (SecurityException) { eventLog.Source = "Application"; } eventLog.WriteEntry("Log message example", EventLogEntryType.Information, 1000); }
这里重要的是不要指定 category参数。如果你这样做,这是相同的 .NET Runtime所谓的魔术,
category
.NET Runtime
无法找到来自 source < ... > 的事件 ID < ... > 的说明。
将会出现。