找不到来自源的事件 ID 的说明

当我写一个日志到 Windows 事件日志,我得到下面的事件,什么是这个消息的根本原因,我如何修复它?非常感谢

事件 ID51001的说明 无法找到来自源 RRWS。 要么是引发这个 事件没有安装在本地 计算机或安装是 已损坏。可以安装或修复 本地计算机上的组件。

如果事件起源于另一个 计算机,显示信息有 随着事件的发生而被保存。

其中包括以下信息 事件:

测试日志信息测试日志信息

消息资源是存在的,但 中找不到该消息 字符串/消息表

160663 次浏览

这通常是由于程序写入事件日志,然后卸载或移动。

您需要为它创建一个事件源和一个消息文件:

var data = new EventSourceCreationData("yourApp", "Application");
data.MessageResourceFile = pathToYourMessageFile;
EventLog.CreateEventSource(data);

然后您需要创建一个 消息文件。还有这个 文章解释的东西(我没有读完它,但它似乎相当完整)。

在使用“ EventCreate”命令行在 ApplicationLog 下创建事件源之后,我得到了这个错误。 此命令在下面创建一个新键: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application

如果您查看已经创建的 Key (例如 SourceTest) ,会看到一个名为 EventMessageFile的字符串值,对我来说它被设置为 %SystemRoot%\System32\EventCreate.exe

改成 c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll

删除 CustomSourceTypesSupported值。

这应该会停止“ 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位) ,所以不可能有匹配..。

作为参考,我根据自己的研究整合了一套技巧,同时解决了这个问题:

  1. 如果您的日志条目 没有以“ 消息资源存在,但在字符串/消息表中找不到该消息”结尾(与原问题相反) :

    • 意味着你丢失了注册信息
    • 再次检查事件源名称和注册表项
  2. 如果需要添加/编辑注册表信息,请记住:

    • 重新启动 事件查看器(如 KB166902第6项和@JotaBe 所述)
    • 如果没有帮助,重新启动 Windows 事件日志/EventLog服务(或者重新启动系统,如@BrunoBieri 所示)。
  3. 如果 不要希望创建自定义 DLL 资源,请注意通常可用的事件消息文件有一些警告:

    • 它们包含大量的标识符,这些标识符试图覆盖大多数情况
      • .NET EventLogMessages.dll(如@Matt 所暗示的)上升到 0xFFFF
      • WindowsEventCreate.exe“只”上升到 0x3E9
    • 每个条目都包含 %1
      • 这意味着只有 第一字符串是 展示
      • 所有传递给 ReportEvent的字符串仍然可以通过查看事件细节来检查(选择所需的事件,转到 细节选项卡并展开 事件数据)
  4. 如果你的 还是在你记录的事件中得到“ 找不到”(原始问题) :

    • 仔细检查正在使用的事件标识符 价值观(在我的例子中,它是事件标识符的 < em > 限定词 部分)
    • 将事件细节(选择所需的事件,转到 细节选项卡并展开 系统)与一个工作示例进行比较

现实世界的解决方案怎么样。

如果你所需要的只是一种“快速而肮脏”的方式来写一些东西到事件日志 而不注册“自定义源”(需要管理权限) ,或者提供“消息文件”(需要工作和头痛) ,只需要这样做:

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所谓的魔术,

无法找到来自 source < ... > 的事件 ID < ... > 的说明。

将会出现。