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

时间:2019-01-17 21:05:37

标签: c# logging .net-core loggerfactory

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

1 个答案:

答案 0 :(得分:0)

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

//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 Event Log - how to register an event source?

问题1 :打开事件查看器以查看自定义应用程序日志的第一个事件时,您会看到您的事件埋在error message中< / strong>。

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

  

问题1修复:新的应用程序日志引用了不存在的消息表文件,或者正在传递的EventId不在消息表中。解决此问题的最简单方法是让您的日志引用现有的消息表文件(例如,.NET运行时),并将其传递给已记录的EventId(我使用了1000)。这需要更改注册表,请按(article for reference and screenshots)进行以下操作:

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

             

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

  8.     
         

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