.net 找不到源中事件id的说明

.net 找不到源中事件id的说明,.net,windows,event-log,.net,Windows,Event Log,当我将日志写入windows事件日志时,我会得到下面的事件,此消息的根本原因是什么,如何修复它?非常感谢 事件ID 51001的说明 找不到来自源的RRW。 引发此问题的组件 事件未安装在本地服务器上 计算机或安装正在运行 腐败。您可以安装或修复 本地计算机上的组件 如果事件起源于另一个 计算机上,显示的信息已被删除 要与事件一起保存 包括以下信息 在活动中: 测试日志消息 消息资源存在,但是 在中找不到该消息 字符串/消息表 这通常是由写入事件日志的程序引起的,然后卸载或移动该程序。您需要为其

当我将日志写入windows事件日志时,我会得到下面的事件,此消息的根本原因是什么,如何修复它?非常感谢

事件ID 51001的说明 找不到来自源的RRW。 引发此问题的组件 事件未安装在本地服务器上 计算机或安装正在运行 腐败。您可以安装或修复 本地计算机上的组件

如果事件起源于另一个 计算机上,显示的信息已被删除 要与事件一起保存

包括以下信息 在活动中:

测试日志消息

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


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

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

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

然后您需要创建一个。还有一点可以解释(我没有全部阅读,但它似乎相当完整)。

在使用“EventCreate”命令行在应用程序日志下创建事件源后,我出现了此错误。 此命令在以下位置创建一个新密钥:
HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application

如果查看已创建的密钥(例如SourceTest),将有一个名为
EventMessageFile
的字符串值,对我来说,该值设置为
%SystemRoot%\System32\EventCreate.exe

将此更改为
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\EventLogMessages.dll

删除
CustomSource
类型支持的值


这将停止“事件ID的描述…”消息。

我也遇到了类似的问题。在做了大量的研究之后,我做了以下几点 我根据本文验证了这些步骤 一切似乎都准备就绪。除了一件事……当我偶然发现这个msdn时,我意识到了这一点

正如最后一段所说。。 '如果应用程序调用RegisterEventSource并传递在注册表中找不到的源名称,则默认情况下,事件日志记录服务使用应用程序日志。但是,由于没有消息文件,事件查看器无法将任何事件标识符或事件类别映射到描述字符串,并将显示错误。因此,您应该为应用程序的注册表添加一个唯一的事件源,并指定一个消息文件。“ 因此,我在RegisterEventSource中的应用程序名称与注册表中的应用程序名称不匹配。我修复了这个,现在它工作了。。。
因此,如果遇到此问题,请仔细检查注册表项。

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

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

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

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

重新启动您的系统

我的一个朋友也有同样的问题。他尝试了所描述的所有选择,但似乎没有任何效果。经过多次研究后,他决定重新启动系统,系统成功了


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

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


注意:我不提供自定义消息文件。事件源的创建使用默认配置。

我也偶然发现了这一点——尽管这是由另一种可能性引起的:事件标识符(在
#define
中被“模糊化”)将严重性设置为错误(如中所述的两个高阶位)。当事件查看器显示事件标识符(低位16位)时,无法找到匹配项

为了便于参考,我根据自己的研究总结了一套解决问题和修复问题的技巧:

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

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

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

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

    • 仔细检查正在使用的事件标识符值(在我的例子中,它是事件标识符的一部分)
    • 比较事件详细信息(选择所需事件,转到“详细信息”选项卡并展开Sy
      EventLog.WriteEntry(
          ".NET Runtime", //magic
          "Your error message goes here!!",
          EventLogEntryType.Warning,
          1000); //magic
      
                  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);
                  }