[英]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)。 这需要更改注册表,步骤如下(参考文章和截图) :
- 打开注册表
- 导航到 Computer\\HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\EventLog
- 单击新事件日志的文件夹。 在这种情况下,“我的事件日志”。
在文件夹中创建新字符串。
值名称 = "EventMessageFile"
数值数据 = "C:\\Windows\\System32\\mscoree.dll"重要提示:上面的值数据路径引用了现有的 .NET 运行时消息表,如果您愿意,可以引用不同的消息表。 由于 .NET 运行时消息表的 EventID 不等于 0,因此我继续遇到相同的错误。 一旦我更改了传递给 .NET 运行时消息表中的现有值(在本例中为 1000)的 eventId,它就会按预期工作,没有错误消息!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.