如何修改tracing_subscriber紧凑日志格式中的日志级别标识?
修改tracing_subscriber紧凑日志格式中的级别标识
tracing-subscriber的compact格式支持自定义日志级别显示,核心思路是关闭默认级别输出,再通过自定义格式化字段替换成你想要的标识。
具体实现步骤
- 自定义级别格式化逻辑:编写函数将
tracing::Level转换成目标字符串(比如把DEBUG改成DBG,INFO改成INF)。 - 拆解compact默认配置:默认的
.compact()是封装好的快捷方法,需要手动构建格式,先关闭默认级别输出,再替换为自定义字段。 - 复用原格式其他逻辑:除级别外,目标、行号、日志内容等字段保留compact的原有格式即可。
完整代码示例
use tracing::Level; use tracing_subscriber::fmt::{self, format::Writer}; // 自定义级别显示,可随意修改成你需要的标识 fn format_level(level: &Level, w: &mut Writer<'_>) -> std::fmt::Result { match level { Level::TRACE => write!(w, "TRACE"), Level::DEBUG => write!(w, " DBG"), // 加空格保持和原格式的对齐效果 Level::INFO => write!(w, " INF"), Level::WARN => write!(w, "WARN"), Level::ERROR => write!(w, "ERR"), } } fn main() { tracing_subscriber::fmt() // 关闭默认级别输出,避免重复显示 .with_level(false) // 自定义格式化字段,仅替换级别,其余沿用compact逻辑 .fmt_fields(move |writer, field, value| { if field.name() == "level" { if let Some(level) = value.downcast_ref::<Level>() { return format_level(level, writer); } } fmt::format::compact().fmt_fields(writer, field, value) }) .init(); // 测试输出,匹配你提供的日志示例 tracing::debug!(target: "nh::nixos", line = 51, "out_dir: TempDir {{ path: \"/tmp/nh-os-uC6E1T\" }}"); tracing::info!(target: "nh::commands", line = 131, "Building NixOS configuration"); }
修改后的日志效果
DBG nh::nixos:51: out_dir: TempDir { path: "/tmp/nh-os-uC6E1T" } INF nh::commands:131: Building NixOS configuration
如果不需要对齐空格,直接去掉字符串中的空格即可(比如写write!(w, "DBG"))。
内容的提问来源于stack exchange,提问作者viperML
相关产品推荐
相关产品推荐

