ASP.NET Core 6使用Serilog记录logscope仅输出Scope属性方案
问题原因
{Properties} 是Serilog输出模板中的全量属性占位符,会默认打印日志事件携带的所有上下文属性,包括ASP.NET Core框架自动注入的SourceContext、ActionId、RequestId、ConnectionId等字段,因此会产生冗余输出。
你手动添加的cfg.Enrich.FromLogContext()配置本身是Serilog.AspNetCore 5.0.0版本默认开启的功能,重复添加不会生效,且该配置的作用是支持从LogContext读取富集属性,和筛选输出属性无关。
解决方法
不需要使用全量{Properties}占位符,直接在输出模板中单独指定需要打印的Scope属性即可,同时用双重大括号转义输出字面量大括号,搭配:j格式化符保证Scope内容以合法JSON格式输出。
修改后的Serilog配置如下:
"Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], "MinimumLevel": "Information", "WriteTo": [ { "Name": "File", "Args": { "path": "", "encoding": "System.Text.Encoding::UTF8", "rollOnFileSizeLimit": true, "fileSizeLimitBytes": 2097152, "retainedFileCountLimit": 10, "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{{Scope={Scope:j}}}{NewLine}{Exception}" } } ] }
Program.cs中的Serilog初始化代码可以删掉注释掉的cfg.Enrich.FromLogContext()行,保持简洁即可:
builder.Logging.ClearProviders(); builder.Host.UseSerilog((context, cfg) => { cfg.ReadFrom.Configuration(context.Configuration); });
效果验证
配置修改完成后重启应用,日志输出将自动过滤所有框架自动生成的冗余属性,完全符合预期格式:
[22:35:03 INF] This is a log message{Scope=["This is a log scope, name:eason"]} [22:35:03 INF] This is another log message{Scope=["This is a log scope, name:eason"]}
补充说明
- 如果后续需要输出其他指定属性(比如RequestId、SourceContext),直接在outputTemplate的对应位置添加
{属性名}占位符即可,无需重新使用全量{Properties}输出所有内容。 - 当代码中没有开启LogScope时,
{Scope:j}会渲染为空数组[],不会导致模板解析报错。
内容的提问来源于stack exchange,提问作者WENJUN CHI
相关产品推荐
相关产品推荐

