【问题标题】:Description for event id from source cannot be found找不到来自源的事件 ID 的描述
【发布时间】:2010-08-05 07:08:35
【问题描述】:

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

事件 ID 51001 的描述 无法找到源 RRWS。 引发此问题的组件 事件未安装在您的本地 电脑或安装是 损坏。您可以安装或修复 本地计算机上的组件。

如果事件起源于另一个 电脑,显示信息有 与事件一起保存。

包含以下信息 与事件:

测试日志信息

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

【问题讨论】:

    标签: .net windows event-log


    【解决方案1】:

    使用“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 值。

    这应该会停止“事件 ID 的描述......”消息。

    【讨论】:

    • 我在其他地方看到过类似的建议,并遵循了它,但无济于事。我仍然得到事件 id 简介...(如果重要的话,我使用的是事件 id 0)
    • @CJM 不确定这是否会有所不同,但我们为 eventId 选择了 100 并且它工作正常。我想要检查的另一件事是权限?虽然我原以为您会收到不同的错误消息,但值得检查。
    • 恐怕这对我不起作用,但我终于想出了如何编译我自己的消息文件,这很奏效。
    • 我在 Windows Server 2008 R2 (x64) 上运行 .NET 4.0.3,所以我使用:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\EventLogMessages.dll跨度>
    【解决方案2】:

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

    如果您只需要一种“快速而肮脏”的方式将内容写入事件日志,而无需注册“自定义源”(需要管理员权限)或提供“消息文件”(需要工作和头痛)就这样做:

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

    这样您将写入现有的“应用程序”日志,而不会出现烦人的“找不到事件 ID 0 的描述”

    如果你想解释“魔法”部分,我在博客上写了 here

    【讨论】:

    • TLDR:“.NET Runtime”是运行时添加的,mscoree.dll定义了一些以1000开头的代码(多少?)作为占位符。
    • 我没有阅读神奇的部分,但您所做的只是写入现有的源(即 .NET 运行时)。我们中的一些人想写我们自己的 AppName 作为来源。
    • 没有.NET Runtime 魔法。诀窍是不指定类别参数。看看:stackoverflow.com/a/58132584/1928164
    【解决方案3】:

    重启系统!

    我的一个朋友也有同样的问题。他尝试了所有描述的选项,但似乎没有任何效果。经过多次研究,also of Microsoft's description,他得出结论重新启动系统,它工作了!!

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

    【讨论】:

    • 这对我来说是个问题。试图弄清楚这一点真是浪费时间。
    • 是的,花费数小时搜索事件转发和 sysmon 的奇怪问题和权限。无论如何重新启动所有机器修复它。
    【解决方案4】:

    您需要为其创建一个事件源和一个消息文件。代码如下所示:

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

    然后您需要创建一个message file。还有这个article 解释了一些事情(我没有全部阅读,但似乎相当完整)。

    【讨论】:

    • 我正在使用 System.Diagnostics.TraceSource.TraceEvent 方法,我得到了同样的错误。您的回答解决了这个问题:但是不应该有更简单的解决方案吗? (IT 人员部署它会变得很复杂;))
    • 我的回答借用了.net 的消息文件,这似乎停止了抱怨。这应该更容易部署,因为它都可以使用 .reg 文件完成。但是,它不像创建自己的消息文件那样让您有机会自定义它。
    【解决方案5】:

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

    New-EventLog -LogName MyApplicationLog `
        -Source MySource `
        -MessageResourceFile C:\windows\Microsoft.NET\Framework\v4.0.30319\EventLogMessages.dll
    

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

    【讨论】:

    【解决方案6】:

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢!没想到重启事件查看器这么简单(重启Windows事件日志服务后)。
    【解决方案7】:

    我也遇到了类似的问题。在做了很多研究之后,我做了以下 我根据这篇文章验证了步骤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 中的应用程序名称与注册表中的应用程序名称不匹配。我解决了这个问题,现在它可以工作了...... 因此,如果您遇到此问题,请仔细检查您的注册表项。

    【讨论】:

      【解决方案8】:

      对我来说,问题是我的目标配置文件意外设置为“.Net Framework 4 客户端配置文件”。当我使用“.Net Framework 4”重建有问题的服务时,问题就消失了!

      【讨论】:

        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

          如果您在创建事件源之前打开事件日志查看器,例如在安装服务时,您将收到该错误消息。您无需重新启动操作系统:您只需关闭并打开事件查看器。

          注意:我不提供自定义消息文件。事件源的创建使用默认配置as shown on Matt's answer

          【讨论】:

          • 那么你的意思是你的事件的历史日志会通过关闭和重新打开日志而改变?我知道你在这点上是错的,但在什么世界里你希望是对的?事件日志的重点是记录发生的事件,而不是事后重写。
          • @Paul McCarthy:不,我不是在暗示。忘记你所知道的:我没有错。作为一名开发人员,我根据自己的经验知道,如果您在查看器已打开的情况下创建事件源,并在该源上创建日志条目,如果您尝试查看它,查看器会显示该错误消息。我猜查看器在打开时会获取已知事件源的列表,并且不会刷新它,除非您重新启动它。更重要的是,正如 Bruno Bieri 在他的回答中所显示的那样,在更严重的情况下,您似乎需要重新启动系统。换句话说,它在日志上,但查看者无法理解它
          【解决方案11】:

          改进@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 应用程序的选项
          • @Alex 我更新了答案以使其对 ASP.NET 更友好。无论如何,我建议为每个应用程序池注册 EventSource,而不是使用预安装的 .NET Runtime 源。
          • eventLog.WriteEntry() 应该在捕获范围内,因为当您尝试写入时会引发 SecurityException。
          • 而且 - 如果没有 `'NET Runtime' 魔法(在我的 Win10、.NET 4.5 项目中),它就无法工作,所以......这个答案几乎是错误的,抱歉。
          • @Bartosz 我不太明白你的意思。为什么我要把eventLog.WriteEntry() 放到catch 中?您的第二条评论也不清楚。没有什么,什么行不通?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-02
          • 2018-11-28
          • 2012-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多