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

ASP.NET Core中Serilog多日志文件配置失效问题求助

问题原因

当前Serilog配置仅添加了两个文件接收器,但未给每个接收器设置日志过滤规则,所有满足Information级别及以上的日志会被所有接收器处理,因此TCP和REST模块的日志都会写入两个文件。

解决方法

需为每个文件接收器添加过滤条件,只允许对应SourceContext的日志写入,以下是两种可行方案:

方案1:修改appsettings.json配置

在每个WriteTo节点中添加Filter配置,通过表达式过滤指定SourceContext的日志:

"Serilog": {
  "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Filters.Expressions" ],
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "TCP": "Information",
      "REST": "Information"
    }
  },
  "WriteTo": [
    {
      "Name": "File",
      "Args": {
        "path": "C:\\path\\TCP.log",
        "rollingInterval": "Infinite",
        "fileSizeLimitBytes": 1073741824,
        "restrictedToMinimumLevel": "Information"
      },
      "Filter": [
        {
          "Name": "ByIncludingOnly",
          "Args": {
            "expression": "SourceContext = 'TCP'"
          }
        }
      ]
    },
    {
      "Name": "File",
      "Args": {
        "path": "C:\\path\\REST.log",
        "rollingInterval": "Infinite",
        "fileSizeLimitBytes": 1073741824,
        "restrictedToMinimumLevel": "Information"
      },
      "Filter": [
        {
          "Name": "ByIncludingOnly",
          "Args": {
            "expression": "SourceContext = 'REST'"
          }
        }
      ]
    }
  ],
  "Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId" ]
}

注意:需先安装Serilog.Filters.Expressions NuGet包,否则表达式过滤规则无法生效。

方案2:通过Program.cs代码配置

若偏好代码方式配置,可在Serilog初始化时为每个文件接收器添加过滤逻辑:

builder.Host.UseSerilog((context, services, configuration) => configuration
    .ReadFrom.Configuration(context.Configuration)
    .Enrich.FromLogContext()
    .Enrich.WithMachineName()
    .Enrich.WithProcessId()
    // 移除配置文件中的两个File接收器,改用代码添加并过滤
    .WriteTo.File(
        path: "C:\\path\\TCP.log",
        rollingInterval: RollingInterval.Infinite,
        fileSizeLimitBytes: 1073741824,
        restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information,
        filter: (logEvent) => logEvent.Properties.ContainsKey("SourceContext") && 
                              logEvent.Properties["SourceContext"].ToString().Trim('"') == "TCP"
    )
    .WriteTo.File(
        path: "C:\\path\\REST.log",
        rollingInterval: RollingInterval.Infinite,
        fileSizeLimitBytes: 1073741824,
        restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information,
        filter: (logEvent) => logEvent.Properties.ContainsKey("SourceContext") && 
                              logEvent.Properties["SourceContext"].ToString().Trim('"') == "REST"
    )
);

注意:使用此方案时,需删除appsettings.json中WriteTo下的两个File节点,避免重复配置。

额外注意事项

  • Log.ForContext("SourceContext", "XXX")中的字符串需和过滤条件完全一致,区分大小写。
  • 若使用配置文件方案,必须确保已安装Serilog.Filters.Expressions依赖包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:58:11