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
相关产品推荐
相关产品推荐

