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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:36:00