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();
问题原因
- 重复添加Console输出:
appsettings.json的Serilog配置中已指定WriteTo.Console,代码里又手动调用.WriteTo.Console(),导致同一日志被两次输出到控制台。 - 配置冲突:
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
相关产品推荐
相关产品推荐

