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

Serilog重复日志问题:如何禁用Microsoft默认日志仅保留Serilog日志

解决Serilog与Microsoft默认日志重复输出问题

使用Serilog.AspNetCore、Serilog.Settings.Configuration、Serilog.Sinks.Console包时,控制台日志每条重复输出两次,示例日志如下:

Hosting environment: Local
15:44:33.961 +05:30 [Information] [] Serilog Initialized.
[15:44:33 INF] Serilog Initialized.
15:44:36.056 +05:30 [Information] [Serilog.AspNetCore.RequestLoggingMiddleware] HTTP "GET" "/swagger/index.html" responded 200 in 188.0470 ms
[15:44:36 INF] HTTP GET /swagger/index.html responded 200 in 188.0470 ms
15:44:36.557 +05:30 [Information] [Serilog.AspNetCore.RequestLoggingMiddleware] HTTP "GET" "/swagger/v1/swagger.json" responded 200 in 326.6425 ms
[15:44:36 INF] HTTP GET /swagger/v1/swagger.json responded 200 in 326.6425 ms

当前配置文件appsettings.json:

"Serilog": {
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Error",
        "Microsoft.AspNetCore": "Error",
        "System": "Error"
      }
    },
    "Enrich": [
      "FromLogContext",
      "WithEnvironmentName",
      "WithMachineName"
    ],
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "outputTemplate": "{Timestamp:HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}"
        }
      }
    ],
    "Properties": {
      "ApplicationName": "MinimalApi-Local"
    }
  },

当前Program.cs代码:

builder.Services.AddLogging(logger =>
            {
                logger.ClearProviders();

                Log.Logger = new LoggerConfiguration()
                   .ReadFrom.Configuration(builder.Configuration)
                   .Enrich.FromLogContext()
                   .WriteTo.Console()
                   .CreateLogger();

                logger.AddSerilog();

                Log.Logger.Information("Serilog Initialized.");
            });


 builder.Host.UseSerilog();

 var app = builder.Build();
 app.UseSerilogRequestLogging();

问题原因

  1. 重复添加Console输出:appsettings.json的Serilog配置中已指定WriteTo.Console,代码里又手动调用.WriteTo.Console(),导致同一日志被两次输出到控制台。
  2. 配置冲突:AddLogging中手动初始化Serilog并添加到日志提供器,同时又调用builder.Host.UseSerilog(),后者会自动接管日志系统,造成重复注册逻辑。

解决方案

修改Program.cs,简化Serilog初始化流程,确保仅通过配置文件加载设置,彻底禁用Microsoft默认日志:

// 通过Host配置Serilog,直接从配置文件读取设置
builder.Host.UseSerilog((context, config) => 
    config.ReadFrom.Configuration(context.Configuration)
         .Enrich.FromLogContext());

// 显式清除所有默认日志提供器,确保无残留
builder.Services.AddLogging(logger => logger.ClearProviders());

Log.Logger.Information("Serilog Initialized.");

var app = builder.Build();
app.UseSerilogRequestLogging();

说明

  • 移除AddLogging中的手动Serilog初始化代码,改用UseSerilog的委托形式加载配置,避免重复注册逻辑。
  • 删除代码中手动添加的.WriteTo.Console(),完全依赖appsettings.json中的控制台输出配置,消除重复输出源。
  • UseSerilog会自动将Serilog设为默认日志提供器,配合ClearProviders()彻底清除Microsoft原生日志组件,确保控制台仅输出Serilog日志。

内容的提问来源于stack exchange,提问作者PratikD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:30:38