繁体   English   中英

如何使用 .net core 的 ILoggerFactory 写入自定义事件源? 有没有办法指定来源?

[英]How do I write to a custom event source using .net core's ILoggerFactory? Is there a way to specify the source?

我正在尝试写入 .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...");

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

//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 开始...消息资源存在但在字符串中找不到消息/消息表

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM