Serilog多Sink场景下如何配置Console与File的差异化日志级别
Serilog 分Sink日志级别配置调整方案
实现逻辑
Serilog 的日志管线支持 单Sink独立级别管控:
- 全局最低级别作为整个管线的统一门槛,低于该级别的日志会被直接丢弃
- 每个输出Sink可以通过
restrictedToMinimumLevel参数单独设置自身的最低输出级别,优先级高于全局配置
调整后核心代码
// 需引入命名空间:using Serilog.Events; 以使用LogEventLevel枚举 var outputTemplate = "[{Level:u3}] {Message:lj}{NewLine}{Exception}"; Log.Logger = new LoggerConfiguration() // 保留全局最低级别为Verbose,保证文件端可接收所有级别日志 .MinimumLevel.Verbose() // 控制台Sink单独指定最低输出级别为Info,自动过滤Verbose、Debug级日志 .WriteTo.Console( outputTemplate: outputTemplate, theme: SystemConsoleTheme.Literate, restrictedToMinimumLevel: LogEventLevel.Info ) // 文件Sink不修改级别配置,继承全局Verbose门槛,记录所有级别日志 .WriteTo.File($"logs/log-{DateTime.Now:yyyy-MM-dd_HH:mm:ss.fff}.log") .CreateLogger();
可选补充配置
- 若需严格限定控制台仅输出Info、Warn、Error三级,排除更严重的Fatal日志,可给Console Sink添加自定义过滤规则:
.WriteTo.Console( outputTemplate: outputTemplate, theme: SystemConsoleTheme.Literate, // 自定义过滤逻辑,仅保留指定三级日志 filter: logEvent => logEvent.Level is LogEventLevel.Info or LogEventLevel.Warning or LogEventLevel.Error )
- 原代码中文件日志的文件名是应用启动时的时间戳,运行期间所有日志会写入同一个文件。如果需要按时间自动滚动生成新日志文件(比如每天/每小时切分),可替换File Sink配置:
.WriteTo.File( path: "logs/log-.log", // 文件名模板,滚动时自动追加时间戳 rollingInterval: RollingInterval.Day, // 按天滚动,可改为Hour/Minute等粒度 outputTemplate: outputTemplate )
内容的提问来源于stack exchange,提问作者nen
相关产品推荐
相关产品推荐

