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

Serilog过滤器配置异常:带过滤的日志文件记录全量日志

问题分析与解决方案

你遇到的问题是带过滤的UPLOADERROR-.log文件仍记录所有日志,核心原因是Serilog JSON配置中sink级过滤的结构错误——你不能直接在File sink节点下嵌套Filter配置项,需要通过Filter包装器sink来实现对特定输出目标的日志过滤。

具体问题点

你的第三个WriteTo项直接在File sink配置里加了Filter节点,但Serilog不识别这种结构。正确的做法是把File sink作为Filter sink的参数,由Filter来控制哪些日志能进入这个文件输出。

修复后的配置

把第三个WriteTo项修改为以下结构,用Filter作为顶层sink,将目标File sink作为它的sink参数:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Literate", "Serilog.Sinks.File", "Serilog.Filters.Expressions" ],
    "MinimumLevel": "Verbose",
    "WriteTo": [
      {
        "Name": "LiterateConsole"
      },
      {
        "Name": "File",
        "Args": {
          "path": "%TEMP%\\Logs\\FileWithoutFilter-.log",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
          "rollingInterval": "Day"
        }
      },
      {
        "Name": "Filter",
        "Args": {
          "expression": "@Level = 'Error' and @UploadError is not null",
          "sink": {
            "Name": "File",
            "Args": {
              "path": "%TEMP%\\Logs\\UPLOADERROR-.log",
              "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
            }
          }
        }
      }
    ]
  }
}

额外说明

  • 我把过滤表达式里的UploadError改成了@UploadError,这是Serilog表达式语法中明确指向结构化属性的写法,能避免潜在的歧义(你的原始表达式也可能生效,但加上@更规范)。
  • 你的C#日志代码Log.Error("Fichero con error {@UploadError}", true);是正确的,{@UploadError}会把参数作为结构化属性传入,过滤表达式能正确匹配到它。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:11:01