无法找到来自源的事件ID的描述

Ji *_*lin 53 .net windows event-log

当我将日志写入Windows事件日志时,我得到下面的事件,这条消息的根本原因是什么,我该如何解决?非常感谢

无法找到源RRWS的事件ID 51001的描述.引发此事件的组件未安装在本地计算机上,或者安装已损坏.您可以在本地计算机上安装或修复该组件.

如果事件源自另一台计算机,则必须随事件一起保存显示信息.

活动中包含以下信息:

测试日志消息

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

Mat*_*att 27

使用"EventCreate"从命令行在Application Log下创建事件源后,出现此错误.此命令在以下位置创建新密钥: 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值.

这应该停止"事件ID ....的描述"消息.

  • 我在Windows Server 2008 R2(x64)上运行.NET 4.0.3,因此我使用了:C:\ Windows\Microsoft.NET\Framework64\v4.0.30319\EventLogMessages.dll (6认同)

Bru*_*eri 18

我的一个朋友也有同样的问题.他尝试了所有描述的选项,但似乎没有任何效果.经过多次研究,也是微软的描述,他总结了重启系统.有效!!

似乎操作系统并非在所有情况下刷新已注册事件源的列表.只有在重新启动后,您才能确保正确注册事件源.

结论:重启系统!

  • 这对我来说是个问题.试图弄清楚那一个是多么浪费时间. (5认同)

Ale*_*lex 15

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

如果您只需要"快速而肮脏"的方式将事情写入事件日志而无需注册"自定义源"(需要管理员权限),或提供"消息文件"(需要工作和头痛),请执行以下操作:

EventLog.WriteEntry(
    ".NET Runtime", //magic
    "Your error message goes here!!",
    EventLogEntryType.Warning,
    1000); //magic
Run Code Online (Sandbox Code Playgroud)

这样你就可以写入现有的"应用程序"日志而不会产生烦人的"无法找到事件ID 0的描述"

如果你想要"魔术"部分解释我在这里写博客

  • TLDR:“.NET Runtime”是运行时添加的,mscoree.dll 定义了一些以 1000 开头的代码(多少?)作为占位符。 (2认同)
  • 我没有阅读魔术部分,但是您所做的只是写到现有Source(即.NET Runtime)上。我们中有些人想写自己的AppName作为源。 (2认同)

Ste*_*gli 12

您需要为其创建事件源和消息文件.代码看起来像这样:

var data = new EventSourceCreationData("yourApp", "Application");
data.MessageResourceFile = pathToYourMessageFile;
EventLog.CreateEventSource(data);
Run Code Online (Sandbox Code Playgroud)

然后,您需要创建一个消息文件.还有这篇文章解释了一些事情(我没有读过所有内容,但似乎相当完整).


Dan*_*röm 5

使用PowerShell创建事件日志和源:

New-EventLog -LogName MyApplicationLog `
    -Source MySource `
    -MessageResourceFile C:\windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll
Run Code Online (Sandbox Code Playgroud)

您将需要消息dll来避免遇到的问题。


Hel*_*ães 5

我也偶然发现了这一点 - 尽管是由另一种可能性引起的:事件标识符(在 a 中“混淆” )将严重性#define设置为错误(事件标识符中所述的两个高位)。由于事件查看器显示事件标识符(低 16 位),因此无法匹配...

作为参考,我在排除故障和修复此问题时根据自己的研究整理了一组技巧:

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

    • 意味着您缺少注册表信息
    • 仔细检查事件源名称和注册表项
  2. 如果您需要添加/编辑注册表信息,请记住:

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

    • 它们拥有大量标识符,试图涵盖大多数情况
      • .NET EventLogMessages.dll(正如@Matt 所暗示的)上升到0xFFFF
      • Windows EventCreate.exe“仅”上升到0x3E9
    • 每个条目包含%1
      • 这意味着只显示一个字符串
      • 仍然可以通过查看事件详细信息来检查传递给的所有字符串ReportEvent(选择所需的事件,转到“详细信息”选项卡并展开“EventData”
  4. 如果您在记录的事件中仍然出现“无法找到”(原始问题):

    • 仔细检查正在使用的事件标识符(在我的例子中,它是事件标识符的限定符部分)
    • 将事件详细信息(选择所需的事件,转到“详细信息”选项卡并展开“系统”)与工作示例进行比较


Ste*_*ary 3

这通常是由写入事件日志然后被卸载或移动的程序引起的。