来源中的事件 ID 描述未找到。

78

当我将日志写入Windows事件日志时,出现了下面的事件,这条消息的根本原因是什么,我该如何修复它?非常感谢。

源RRWS中事件ID 51001的说明找不到。引发此事件的组件未安装在本地计算机上,或者安装已损坏。您可以在本地计算机上安装或修复该组件。

如果事件始于另一台计算机,则必须使用事件保存显示信息。

以下信息包含在事件中:

测试日志消息

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


当我尝试使用当前用户账户运行一个.NET 7.0的Windows服务时,出现了这个错误。将应用程序安装为服务并启动服务,会创建所需的注册信息以便生成事件日志,而不会产生此错误。我推测需要管理员权限才能让.NET在注册表中注册事件源。 - Mort
12个回答

35

在使用“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

删除CustomSourceTypesSupported值。

这样就可以停止“The description for Event ID....”消息。


我曾在其他地方看到过类似的建议,并且已经遵循了它,但是没有效果。我仍然会得到事件ID的简短描述...(如果有影响,我正在使用事件ID 0) - CJM
@CJM 不确定是否会有任何区别,但我们选择了100作为eventId,它可以正常工作。我想要检查的另一件事是权限?虽然我认为你会得到不同的错误消息,但值得检查。 - Matt
1
我很遗憾这对我并没有起作用,但最终我想出了如何编译自己的消息文件,结果非常好。 - CJM
7
我正在运行.NET 4.0.3在Windows Server 2008 R2(x64)上,所以我使用了:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\EventLogMessages.dll。 - peteski
更多信息可在https://technet.microsoft.com/en-us/library/bb490899.aspx找到。 - Terence Golla

30

如何实现一个真实世界的解决方案呢?

如果你只需要一种"快速简单"的方式来将一些东西写入事件日志而不需要注册"自定义来源"(需要管理员权限),或者提供"消息文件"(需要耗费时间和精力),那么只需这样做:

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

这样做,您就可以写入一个现有的"应用程序"日志,而不会出现烦人的"The description for Event ID 0 cannot be found"。

如果您想要解释"magic"部分,我在这里写了一篇博客。


2
简而言之,".NET Runtime"是由运行时添加的,而mscoree.dll定义了一些代码(有多少?)从1000开始作为占位符。 - kitsu.eb
2
我没有读神奇的部分,但你所做的就是向现有的源(即.NET Runtime)写入。我们中的一些人想要将日志写入我们自己的AppName作为源。 - joedotnot
没有.NET Runtime的魔法。诀窍在于不指定类别参数。请看:https://dev59.com/CnA75IYBdhLWcg3wOWRd#58132584 - Zverev Evgeniy
非常适合我的需求,我只需要向事件查看器编写一些测试消息即可。 - jamie
多年来一直在处理事件日志,创建自定义日志等,但仍然会出现奇怪的结果。最终使用了.NET Runtime,这样就解决了问题,但是1000是一个魔数,它修复了它。 - Michael

28

重新启动你的系统!

我的一个朋友也遇到了完全相同的问题。他尝试了所有描述的选项,但似乎没有什么作用。经过多次研究,包括微软的描述, 他得出结论:重新启动系统就可以解决问题!

似乎在某些情况下,操作系统不会刷新已注册事件源的列表。只有在重新启动后,您才能确保事件源已正确注册。


8
这对我来说是个问题,试图解决它太浪费时间了。 - Tim
是的,花了几个小时搜索事件转发和Sysmon的奇怪问题和权限。无论如何,重新启动所有机器都解决了问题。 - nutt318

14
您需要创建一个事件源和一个消息文件。代码看起来像这样:

You need to create an event source and a message file for it. Code looks something like this:

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

那么您需要创建一个消息文件。 这里还有一篇文章解释了相关事项(我没有完全阅读,但它似乎相当完整)。


我正在使用System.Diagnostics.TraceSource.TraceEvent方法,但是遇到了相同的错误。你的答案解决了这个问题:但是难道没有更简单的解决方案吗?(如果与IT人员部署会变得复杂) - MADMap
我的答案借用了来自 .net 的消息文件,这似乎使其停止抱怨。这应该更容易部署,因为它可以通过 .reg 文件完成所有操作。然而,它并不能像创建自己的消息文件那样让您有机会进行自定义。 - Matt

6
使用PowerShell创建您的事件日志和源:
使用PowerShell来创建您的事件日志和源:
New-EventLog -LogName MyApplicationLog `
    -Source MySource `
    -MessageResourceFile C:\windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll

您需要安装messages.dll文件来避免出现您目前遇到的问题。


有关如何使用的更多信息,请参见New-EventLog - stomtech

5
我也遇到了这个问题,尽管是由另一种可能性引起的:事件标识符(在#define中被“混淆”)将severity设置为error(如事件标识符中所述的两个高位比特)。因为Event Viewer显示事件标识符(低16位),所以无法匹配...
供参考,我根据自己的研究经验整理了一些提示来解决和修复此问题:
  1. 如果你的日志记录不是以“消息资源存在,但在字符串/消息表中找不到消息”结尾(与原问题相反):

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

    • 重新启动事件查看器(如KB166902第6项所述,以及@JotaBe提到的)
    • 如果还不起作用,请重新启动Windows事件日志/ EventLog服务(或者按@BrunoBieri的建议重新启动系统)。
  3. 如果你不想创建自定义DLL资源,请注意常见的事件消息文件有一些注意事项:

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

    • 仔细检查正在使用的事件标识符(在我的情况下,它是事件标识符的Qualifiers部分)
    • 将事件详细信息(选择所需事件,转到详细信息选项卡并展开系统)与有效示例进行比较

谢谢!我没想到重新启动事件查看器(在重启Windows事件日志服务后)如此简单。 - Mark Berry

3

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


我已经移除了一个写入事件日志的服务,然后在重新安装并尝试启动它时出现了这个错误。你能否提供解决这个错误的建议? - Muhammad Zakaria
1
如果你卸载并重新安装了,可能只需要重启一下。 - Stephen Cleary
重启没有起作用! - Muhammad Zakaria
我建议你提出自己的问题。 - Stephen Cleary

3
我也遇到了类似的问题。经过大量研究后,我按照这篇文章中的步骤进行验证: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中的应用程序名称与注册表中的应用程序名称不匹配。我解决了这个问题,现在它可以工作了......因此,如果您遇到此问题,请仔细检查注册表条目。

2
如果在创建事件源之前打开事件日志查看器,例如在安装服务时,您会收到该错误消息。您不需要重新启动操作系统:只需关闭并重新打开事件查看器即可。
注意:我不提供自定义消息文件。事件源的创建使用默认配置如Matt的答案所示

那么您的建议是通过关闭和重新打开日志来更改事件的历史记录吗? 我知道您在这方面是错误的,但在什么世界中您想要是正确的呢?事件日志的整个目的是记录发生的事件,而不是事后重写它们。 - Paul McCarthy
@Paul McCarthy:不,我不是在建议那个。忘掉你所知道的:我没有错。作为一名开发者,根据我的经验,如果你在查看器已经打开的情况下创建一个事件源,并在该源上创建一个日志条目,如果你尝试查看它,查看器会显示该错误消息。我猜测,查看器在打开时获取已知事件源列表,并且除非你重新启动它,否则不会刷新它。更重要的是,正如Bruno Bieri在他的回答中所示,似乎在更严重的情况下,你需要重新启动系统。换句话说,它在日志中,但查看器无法理解它。 - JotaBe

1
对我来说,问题在于我的目标配置文件错误地设置为“.Net Framework 4 Client profile”。当我使用“.Net Framework 4”重新构建相关服务时,问题就解决了!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接