如何通过JSON配置Serilog分文件记录不同级别日志?
解决Serilog JSON配置分级别写入不同文件的问题
你之前的配置问题在于:LogEventLevel不是File接收器的合法参数,而RestrictedToMinimumLevel仅设置最低级别(比如设为Information会包含所有≥Information的日志,自然也会混入Error/Fatal),所以两个文件才会写入全量日志。
要实现指定级别范围拆分日志,需要结合Serilog的过滤功能,通过Filter.ByIncludingOnly表达式精准筛选写入的日志级别,具体步骤如下:
1. 安装依赖包
确保项目已安装Serilog.Filters.Expressions(支持级别表达式过滤的必要依赖):
dotnet add package Serilog.Filters.Expressions
2. 修改JSON配置文件
替换原WriteTo节点内容,为每个文件接收器添加Filter配置,指定要包含的日志级别:
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Information", "System": "Warning" } }, "WriteTo": [ { "Name": "File", "Args": { "path": "./logs/log-informacion-.txt", "rollingInterval": "Day" }, "Filter": [ { "Name": "ByIncludingOnly", "Args": { "expression": "Level.Information or Level.Warning" } } ] }, { "Name": "File", "Args": { "path": "./logs/log-errores-.txt", "rollingInterval": "Day" }, "Filter": [ { "Name": "ByIncludingOnly", "Args": { "expression": "Level.Error or Level.Fatal" } } ] } ] } }
3. 验证效果
保持你的Program.cs代码不变,重新运行项目后:
log-informacion-.txt仅写入Information和Warning级别的日志log-errores-.txt仅写入Error和Fatal级别的日志
关键说明
Filter.ByIncludingOnly会只保留符合表达式条件的日志,精准控制写入范围- 表达式中的
Level.XXX对应Serilog的日志级别枚举,支持or/and逻辑组合 - 全局
MinimumLevel仍需保留,它控制Serilog接收的最低日志级别,避免遗漏需要处理的日志
内容的提问来源于stack exchange,提问作者Álvaro García
相关产品推荐
相关产品推荐

