【发布时间】:2010-08-05 07:08:35
【问题描述】:
当我将日志写入 Windows 事件日志时,我收到以下事件,此消息的根本原因是什么,我该如何解决?非常感谢
事件 ID 51001 的描述 无法找到源 RRWS。 引发此问题的组件 事件未安装在您的本地 电脑或安装是 损坏。您可以安装或修复 本地计算机上的组件。
如果事件起源于另一个 电脑,显示信息有 与事件一起保存。
包含以下信息 与事件:
测试日志信息
消息资源存在但 邮件中找不到 字符串/消息表
【问题讨论】:
当我将日志写入 Windows 事件日志时,我收到以下事件,此消息的根本原因是什么,我该如何解决?非常感谢
事件 ID 51001 的描述 无法找到源 RRWS。 引发此问题的组件 事件未安装在您的本地 电脑或安装是 损坏。您可以安装或修复 本地计算机上的组件。
如果事件起源于另一个 电脑,显示信息有 与事件一起保存。
包含以下信息 与事件:
测试日志信息
消息资源存在但 邮件中找不到 字符串/消息表
【问题讨论】:
使用“EventCreate”从命令行在应用程序日志下创建事件源后出现此错误。
此命令在以下位置创建一个新密钥:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
如果您查看已创建的密钥(例如 SourceTest),将会有一个名为EventMessageFile 的字符串值,对我来说它设置为%SystemRoot%\System32\EventCreate.exe。
将此更改为c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll
删除CustomSource 和TypesSupported 值。
这应该会停止“事件 ID 的描述......”消息。
【讨论】:
现实世界的解决方案怎么样。
如果您只需要一种“快速而肮脏”的方式将内容写入事件日志,而无需注册“自定义源”(需要管理员权限)或提供“消息文件”(需要工作和头痛)就这样做:
EventLog.WriteEntry(
".NET Runtime", //magic
"Your error message goes here!!",
EventLogEntryType.Warning,
1000); //magic
这样您将写入现有的“应用程序”日志,而不会出现烦人的“找不到事件 ID 0 的描述”
如果你想解释“魔法”部分,我在博客上写了 here
【讨论】:
.NET Runtime 魔法。诀窍是不指定类别参数。看看:stackoverflow.com/a/58132584/1928164
重启系统!
我的一个朋友也有同样的问题。他尝试了所有描述的选项,但似乎没有任何效果。经过多次研究,also of Microsoft's description,他得出结论重新启动系统,它工作了!!
似乎操作系统并非在所有情况下都会刷新已注册事件源的列表。只有在重新启动后,您才能确定事件源已正确注册。
【讨论】:
您需要为其创建一个事件源和一个消息文件。代码如下所示:
var data = new EventSourceCreationData("yourApp", "Application");
data.MessageResourceFile = pathToYourMessageFile;
EventLog.CreateEventSource(data);
然后您需要创建一个message file。还有这个article 解释了一些事情(我没有全部阅读,但似乎相当完整)。
【讨论】:
使用 PowerShell 创建您的事件日志和来源:
New-EventLog -LogName MyApplicationLog `
-Source MySource `
-MessageResourceFile C:\windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll
您需要消息 dll 来避免您遇到的问题。
【讨论】:
我也偶然发现了这一点 - 尽管是由另一种可能性引起的:事件标识符(在 #define 中被“混淆”)将 severity 设置为 error (Event Identifiers 中所述的两个高位)。由于 Event Viewer 显示事件标识符(低 16 位),因此无法匹配...
作为参考,我根据自己的研究整理了一组技巧,同时排除和修复此问题:
如果您的日志条目没有以“消息资源存在但在字符串/消息表中找不到消息”结尾(与原始问题):
如果您需要添加/编辑注册表信息,请记住:
EventLog 服务(或按照 @BrunoBieri 的提示重新启动系统)。如果您不希望创建自定义 DLL 资源,请注意常用的事件消息文件有一些注意事项:
EventLogMessages.dll(由@Matt 暗示)上升到0xFFFF
EventCreate.exe“仅”上升到0x3E9
%1
ReportEvent的所有字符串仍然可以通过查看事件详细信息进行检查(选择所需的事件,转到详细信息选项卡并展开EventData)如果您在记录的事件中仍然收到“找不到”(原始问题):
【讨论】:
我也遇到了类似的问题。在做了很多研究之后,我做了以下 我根据这篇文章验证了步骤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 中的应用程序名称与注册表中的应用程序名称不匹配。我解决了这个问题,现在它可以工作了...... 因此,如果您遇到此问题,请仔细检查您的注册表项。
【讨论】:
对我来说,问题是我的目标配置文件意外设置为“.Net Framework 4 客户端配置文件”。当我使用“.Net Framework 4”重建有问题的服务时,问题就消失了!
【讨论】:
这通常是由写入事件日志然后被卸载或移动的程序引起的。
【讨论】:
如果您在创建事件源之前打开事件日志查看器,例如在安装服务时,您将收到该错误消息。您无需重新启动操作系统:您只需关闭并打开事件查看器。
注意:我不提供自定义消息文件。事件源的创建使用默认配置as shown on Matt's answer。
【讨论】:
改进@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所谓的魔法也是一样的,
找不到来自源 <...> 的事件 ID <...> 的描述。
即将出现。
【讨论】:
The source was not found, but some or all event logs could not be searched. To create the source, you need permission to read all event logs to make sure that the new source name is unique. 所以你仍然需要注册一个来源。例如,这不是 ASP.NET 应用程序的选项
.NET Runtime 源。
eventLog.WriteEntry() 应该在捕获范围内,因为当您尝试写入时会引发 SecurityException。
eventLog.WriteEntry() 放到catch 中?您的第二条评论也不清楚。没有什么,什么行不通?