下面的代码和说明使我的 .NETCore/C# 控制台应用程序成功写入事件查看器中的“自定义应用程序日志”没有事件 ID 描述错误 (see 问题 #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...");
NOTE #1:如果您正在更改现有源程序的目标日志...或者换句话说,如果您正在重新指向已写入事件日志的程序,则需要重新启动才能注册。如果日志是新创建的,则写入成功。请参阅此线程以获取更多信息:Windows 事件日志 - 如何注册事件源? https://stackoverflow.com/questions/2667248/windows-event-log-how-to-register-an-event-source
ISSUE #1:当您打开事件查看器查看自定义应用程序日志的第一个事件时,你会发现你的事件被埋在错误信息 https://i.stack.imgur.com/PLjvD.png.
无法找到源“我的程序”中事件 ID 0 的描述。您的本地计算机上未安装引发此事件的组件,或者安装已损坏。您可以在本地计算机上安装或修复该组件。
如果事件源自另一台计算机,则显示信息必须与事件一起保存。事件中包含以下信息:
我的程序
每日加载开始...消息资源存在,但在字符串/消息表中找不到该消息
问题 #1 修复:新的应用程序日志引用不存在的消息表文件,或者传递的 EventId 不在消息表中。解决此问题的最简单方法是让日志引用现有的消息表文件(例如 .NET 运行时)并向其传递记录的 EventId(我使用 1000)。这需要更改注册表,步骤如下(文章供参考及截图) https://www.jitbit.com/alexblog/266-writing-to-an-event-log-from-net-without-the-description-for-event-id-nonsense/:
- 打开注册表
- 导航到计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog
- 单击新事件日志的文件夹。在本例中为“我的事件日志”。
-
在文件夹中创建新字符串。
值名称 =“EventMessageFile”
值数据 =“C:\Windows\System32\mscoree.dll”
重要的: the 价值数据上面的路径引用现有的.NET运行时消息表,如果您愿意,您可以引用不同的消息表。由于 .NET 运行时消息表的 EventID 不等于 0,因此我继续收到相同的错误。一旦我将要传递的 eventId 更改为 .NET 运行时消息表中的现有值(在本例中为 1000),它就会按预期工作,没有错误消息!