Dotnet 7 Windows服务日志未写入自定义事件日志求助
.NET 7 Windows服务自定义EventLog日志写入问题修复
问题根源分析
你的代码存在两个核心问题:
- 日志配置加载顺序错误:
AddConfiguration在AddEventLog之后调用,导致EventLog提供器无法正确读取appsettings.json中的自定义日志配置,默认写入"应用程序"日志。 - EventLog源与自定义日志的关联未生效:即使自定义日志已存在,若源
TestSourceName未明确关联到TestSourceNameLogs,系统会默认将日志写入"应用程序"日志。
修复步骤
1. 修正Program.cs代码顺序与配置逻辑
将配置加载移至EventLog提供器添加之前,同时确保源与日志的关联创建逻辑生效:
using Microsoft.Extensions.Logging.Configuration; using Microsoft.Extensions.Logging.EventLog; using TestSourceName.QueueWorker; using System.Diagnostics; HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); builder.Services.AddWindowsService(options => { options.ServiceName = "TestSourceName"; }); // 必须以管理员权限运行一次,创建源并关联到自定义日志(创建后可注释) if (!EventLog.SourceExists("TestSourceName")) { EventLog.CreateEventSource("TestSourceName", "TestSourceNameLogs"); } // 先加载appsettings中的日志配置 builder.Logging.AddConfiguration(builder.Configuration.GetSection("Logging")); // 注册EventLog选项提供器 LoggerProviderOptions.RegisterProviderOptions<EventLogSettings, EventLogLoggerProvider>(builder.Services); // 添加EventLog日志提供器(自动读取已加载的配置) builder.Logging.AddEventLog(); builder.Services.AddHostedService<WindowsBackgroundService>(); IHost host = builder.Build(); host.Run();
2. 确保源与日志的关联正确
- 打开Event Viewer,定位到「应用程序和服务日志」→
TestSourceNameLogs,右键选择「属性」。 - 切换到「源」标签页,确认
TestSourceName已在列表中。若未找到,需手动添加或重新运行管理员权限的程序执行创建逻辑。
3. 验证配置优先级
保持appsettings.json的配置不变,此时EventLog提供器会优先读取配置文件中的LogName和SourceName,无需手动在代码中重复设置。
关键注意事项
- 创建EventLog源必须使用管理员权限,否则会抛出权限不足的异常。
- 每个EventLog源只能关联一个日志,若之前
TestSourceName曾关联到"应用程序"日志,需先删除旧源再重新创建。
内容的提问来源于stack exchange,提问作者Astro
相关产品推荐
相关产品推荐

