.NET Core 6控制台应用如何通过appsettings.json配置EventLog并保留其他提供者
解决.NET Core 6控制台应用EventLog配置不生效且保留默认日志提供者的问题
方法1:通过ConfigureLogging替换默认EventLog提供者
Host.CreateDefaultBuilder默认添加的EventLog提供者会优先于配置加载初始化,导致直接修改appsettings.json的配置无法覆盖默认参数。我们可以先移除默认的EventLog注册,再添加带自定义配置的实例:
var host = Host.CreateDefaultBuilder(args) .ConfigureLogging((context, logging) => { // 找到默认注册的EventLogLoggerProvider var eventLogService = logging.Services.FirstOrDefault(s => s.ServiceType == typeof(ILoggerProvider) && s.ImplementationType == typeof(EventLogLoggerProvider)); if (eventLogService != null) { logging.Services.Remove(eventLogService); // 重新添加带自定义配置的EventLog提供者 logging.AddEventLog(options => { // 从配置文件读取参数,也可直接硬编码 context.Configuration.GetSection("Logging:EventLog").Bind(options); // 可选:设置默认值避免配置缺失 options.LogName = options.LogName ?? "MyAppEventLog"; options.SourceName = options.SourceName ?? "MyConsoleAppSource"; }); } }) .Build();
对应的appsettings.json配置示例:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.Hosting.Lifetime": "Information" }, "EventLog": { "LogName": "CustomApplicationLog", "SourceName": "MyDotNetConsoleApp", "LogLevel": { "Default": "Warning" } } } }
方法2:通过ConfigureServices直接替换EventLog服务注册
也可以在服务配置阶段替换默认的EventLog提供者实例,实现相同效果:
var host = Host.CreateDefaultBuilder(args) .ConfigureServices((context, services) => { // 移除默认的EventLogLoggerProvider注册 var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(ILoggerProvider) && d.ImplementationType == typeof(EventLogLoggerProvider)); if (descriptor != null) { services.Remove(descriptor); // 添加自定义配置的EventLog提供者 services.AddSingleton<ILoggerProvider>(sp => { var settings = new EventLogSettings(); context.Configuration.GetSection("Logging:EventLog").Bind(settings); settings.LogName = settings.LogName ?? "DefaultAppLog"; settings.SourceName = settings.SourceName ?? "DefaultConsoleSource"; return new EventLogLoggerProvider(settings); }); } }) .Build();
关键说明
- 核心逻辑是移除默认的EventLog提供者注册,再重新添加带自定义配置的实例,这样既保留了控制台、调试等默认日志提供者,又能让EventLog使用自定义的
LogName和SourceName。 - 首次创建EventLog日志源时,应用需要管理员权限运行;后续使用普通权限即可写入日志。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

