下面的代码和解释使我的 .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)。这需要更改注册表,步骤如下(参考文章和屏幕截图):
- 打开注册表
- 导航到计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog
- 单击新事件日志的文件夹。在这种情况下,“我的事件日志”。
在文件夹中创建新字符串。
值名称 = “EventMessageFile”
值数据 = “C:\Windows\System32\mscoree.dll”
重要提示:上面的值数据路径引用了现有的 .NET 运行时消息表,如果您愿意,可以引用不同的消息表。因为 .NET 运行时消息表的 EventID 不等于 0,所以我继续收到相同的错误。一旦我将要传递的 eventId 更改为 .NET 运行时消息表中的现有值(在本例中为 1000),它就会按预期工作,没有错误消息!