4

我正在尝试写入 .netcore/c# 中的自定义事件源,但尚未找到指定 .net core 记录器对象的目标源的方法。在这种情况下,我想写入“我的事件日志”而不是应用程序日志。下面的代码成功写入应用程序日志,但我想将它指向“我的事件日志”事件源。

if (!EventLog.SourceExists("My Event Log"))
{
    EventLog.CreateEventSource("My Event Log", "My Program");
}

ILoggerFactory loggerFactory = new LoggerFactory()
        .AddConsole()
        .AddDebug()
        .AddEventLog();

ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("DAILY LOAD starting...");
4

1 回答 1

7

下面的代码和解释使我的 .NETCore/C# 控制台应用程序成功写入事件查看器中的“自定义应用程序日志”,而没有事件 ID 描述错误(如果您遇到此问题,请参阅ISSUE #1 FIX )。

//libraries needed..
//using Microsoft.Extensions.Logging;
//using Microsoft.Extensions.Logging.EventLog;

string _sourceName = "My Program"; //source program name
string _logName = "My Event Log"; //new event log or targeted event log name

//if custom event log does not exist, create it
if (!EventLog.SourceExists(_logName))
{
    //event log creates new app log and associates program, "My Program", with new log, "My Event Log"
    EventLog.CreateEventSource(_sourceName, _logName);
}

EventLogSettings myEventLogSettings = new EventLogSettings
    {
        SourceName = _sourceName,
        LogName = _logName
    };

ILoggerFactory loggerFactory = new LoggerFactory()
            .AddConsole()
            .AddDebug()
            .AddEventLog(myEventLogSettings);

ILogger logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation(1000, "DAILY LOAD starting...");

注意#1:如果您正在更改现有源程序的目标日志......或者换句话说,如果您正在重新指向一个已经写入事件日志的程序,这将需要重新启动才能注册。如果日志是新创建的,它将成功写入。有关更多信息,请参阅此线程:Windows 事件日志 - 如何注册事件源?

问题 #1:当您打开事件查看器查看自定义应用程序日志的第一个事件时,您会看到您的事件隐藏在错误消息中。

找不到来自源“我的程序”的事件 ID 0 的描述。引发此事件的组件未安装在本地计算机上,或者安装已损坏。您可以在本地计算机上安装或修复组件。如果事件起源于另一台计算机,则显示信息必须与事件一起保存。事件中包含以下信息:myProgram DAILY LOAD 开始...消息资源存在,但在字符串/中找不到消息消息表

ISSUE #1 FIX:新的应用程序日志要么引用不存在的消息表文件,要么传递的 EventId 不在消息表中。解决此问题的最简单方法是让您的日志引用现有的消息表文件(例如,.NET 运行时)并将记录的 EventId 传递给它(我使用 1000)。这需要更改注册表,步骤如下(参考文章和屏幕截图)

  1. 打开注册表
  2. 导航到计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog
  3. 单击新事件日志的文件夹。在这种情况下,“我的事件日志”。
  4. 在文件夹中创建新字符串。

    值名称 = “EventMessageFile”
    值数据 = “C:\Windows\System32\mscoree.dll”

重要提示:上面的值数据路径引用了现有的 .NET 运行时消息表,如果您愿意,可以引用不同的消息表。因为 .NET 运行时消息表的 EventID 不等于 0,所以我继续收到相同的错误。一旦我将要传递的 eventId 更改为 .NET 运行时消息表中的现有值(在本例中为 1000),它就会按预期工作,没有错误消息!

于 2019-01-18T21:26:24.820 回答