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

时间:2010-08-05 07:08:35

标签: .net windows event-log

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

  

事件ID 51001的说明   来自源RRWS无法找到。   提出这个的组件   事件未安装在您的本地   电脑或安装是   损坏。您可以安装或修复   本地计算机上的组件。

     

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

     

包含以下信息   事件:

     

测试日志消息

     

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

10 个答案:

答案 0 :(得分:27)

使用“EventCreate”从命令行在Application Log下创建事件源后出现此错误。 此命令在以下位置创建新密钥: 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的描述....”消息。

答案 1 :(得分:17)

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

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

结论:重新启动系统!

答案 2 :(得分:12)

真实世界的解决方案。

如果你需要的只是一个快速而又肮脏的"将事情写入事件日志的方法,而无需注册"自定义来源" (需要管理员权限),或提供"消息文件" (需要工作和头痛)只需这样做:

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

这样你就可以写一个现有的应用程序"没有烦人的日志"无法找到事件ID 0的描述"

如果你想要"魔法"部分解释我在博客上发表了here

答案 3 :(得分:4)

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

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

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

答案 4 :(得分:3)

我也偶然发现了这一点 - 虽然是由另一种可能性引起的:事件标识符(在#define中被&#34;模糊处理&#34;)将严重性设置为< em>错误(Event Identifiers中所述的两个高位)。由于事件查看器显示事件标识符(低16位),因此无法匹配...

作为参考,我在根据自己的研究提出了一系列提示,同时排除故障并解决此问题:

  1. 如果您的日志条目以&#34; 结尾,则会显示消息资源,但在字符串/消息表中找不到该消息&#34; (与原始问题相反):

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

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

    • 他们拥有大量的标识符,试图涵盖大多数情况
      • .NET EventLogMessages.dll(由@Matt暗示)最多0xFFFF
      • Windows EventCreate.exe&#34;仅限&#34;最多0x3E9
    • 每个条目都包含%1
      • 这意味着只有第一个字符串显示
      • 通过查看事件详细信息(选择所需的事件,转到详细信息标签并展开 EventData ),仍然可以检查传递给ReportEvent的所有字符串/ LI>
  4. 如果您仍然无法找到&#34; &#34;在您记录的事件中(原始问题):

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

答案 5 :(得分:2)

我也面临类似的问题。经过大量的研究,我做了以下 我根据这篇文章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中的应用程序名称与注册表中的应用程序名称不匹配。我修好了,现在它有效...... 因此,如果您遇到此问题,请仔细检查您的注册表项。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

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

答案 8 :(得分: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所谓的魔术来说,

  

找不到源<...>中事件ID <...>的描述。

将会出现。

答案 9 :(得分:-1)

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