Serilog为何仅在Debug以上日志级别输出中出现额外加粗文本?
现象本质说明
你观察到的、仅在Information/Warn/Error级别出现的带info: /warn: /fail: 前缀的额外文本,和你配置的Serilog逻辑没有任何关系,也不是Serilog内置格式的特殊加粗效果。
产生逻辑拆解
- 这类基于.NET通用主机构建的程序,默认会集成微软官方的
Microsoft.Extensions.Logging(MEL)日志框架,默认挂载内置的控制台日志提供程序,这个内置提供程序的原生输出格式就是<小写日志级别>: <日志来源的命名空间/类名>[<事件ID>],紧跟换行后的日志消息内容,和你示例里的额外输出格式完全一致。 - 内置MEL控制台提供程序默认会对级别前缀应用终端颜色高亮,视觉上接近加粗效果;同时它的默认输出阈值为
Information级别,即只有日志级别>=Information时才会触发输出,Debug级别的日志会被内置提供程序直接过滤,这就完美匹配你观察到的“只有Debug以上级别才会出现加粗感的额外文本”的现象。 - 你当前的接入方式没有清理MEL默认挂载的内置日志提供程序,导致两套日志输出逻辑同时工作:
- Debug级别:仅Serilog的Console Sink按照你自定义的
[{Timestamp:g} {Level:u3}] {Message:lj}{NewLine}格式输出日志,无额外内容 - Info/Warn/Error级别:先由MEL内置控制台提供程序输出自带格式的日志,再由Serilog的Console Sink输出你自定义格式的日志,最终形成你看到的重复三行输出效果。
- Debug级别:仅Serilog的Console Sink按照你自定义的
修复方案
- 代码层面修复:在主机初始化链路中清空所有MEL内置日志提供程序,再接入Serilog作为唯一日志实现,示例代码:
Host.CreateDefaultBuilder(args) // 清除MEL默认挂载的所有日志提供程序 .ClearLoggingProviders() .UseSerilog((hostContext, loggerConfig) => { // 从配置文件读取Serilog配置,和你现有的JSON配置完全兼容 loggerConfig.ReadFrom.Configuration(hostContext.Configuration); })
- 配置层面修复:如果不想改动代码,直接在配置文件中关闭MEL内置Console提供程序的输出即可,在现有Serilog配置同级的
Logging配置节下补充:
{ "Logging": { "Console": { "LogLevel": { "Default": "None" } } } }
内容的提问来源于stack exchange,提问作者EddieWeb
相关产品推荐
相关产品推荐

