You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dotnet 7 Windows服务日志未写入自定义事件日志求助

.NET 7 Windows服务自定义EventLog日志写入问题修复

问题根源分析

你的代码存在两个核心问题:

  1. 日志配置加载顺序错误:AddConfiguration在AddEventLog之后调用,导致EventLog提供器无法正确读取appsettings.json中的自定义日志配置,默认写入"应用程序"日志。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:35:38