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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:45:42