.NET 8中Serilog重复日志问题:如何关闭非JSON格式日志?
重复日志问题原因及解决方法
问题原因
你的Serilog配置同时通过代码和JSON配置文件添加了两次控制台输出:
- 代码中通过
.WriteTo.Console(new CompactJsonFormatter())指定了JSON格式的控制台输出 - JSON配置里的
Serilog.WriteTo数组又添加了一个默认使用非JSON格式的控制台输出
两者叠加导致每条日志被输出两次,一次是非JSON格式,一次是JSON格式。
解决方法
任选以下一种方式即可:
方式1:移除代码中的控制台输出配置,完全依赖JSON配置
修改C#代码,移除硬编码的控制台输出配置,让Serilog仅从配置文件读取设置。如果需要JSON格式,在配置文件中指定格式化器:
修改后的C#代码:
builder.Logging.ClearProviders(); builder.Host.UseSerilog((context, provider, configuration) => configuration .ReadFrom.Configuration(context.Configuration) .ReadFrom.Services(provider) .Enrich.FromLogContext() .Enrich.WithThreadId() .Enrich.WithThreadName()); app.UseSerilogRequestLogging();
修改JSON配置,为Console写入器添加CompactJsonFormatter:
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "System": "Warning" } }, "WriteTo": [ { "Name": "Console", "Args": { "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact" } } ] }, "Logging": { "LogLevel": { "Default": "None" } } }
方式2:移除JSON配置中的控制台输出,完全依赖代码配置
修改JSON配置,删除Serilog.WriteTo数组里的Console项:
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "System": "Warning" } } }, "Logging": { "LogLevel": { "Default": "None" } } }
C#代码保持不变即可,此时仅代码中配置的JSON格式控制台输出生效。
内容的提问来源于stack exchange,提问作者mrt181
相关产品推荐
相关产品推荐

