You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改tracing_subscriber紧凑日志格式中的日志级别标识?

修改tracing_subscriber紧凑日志格式中的级别标识

tracing-subscriber的compact格式支持自定义日志级别显示,核心思路是关闭默认级别输出,再通过自定义格式化字段替换成你想要的标识。

具体实现步骤

  1. 自定义级别格式化逻辑:编写函数将tracing::Level转换成目标字符串(比如把DEBUG改成DBG,INFO改成INF)。
  2. 拆解compact默认配置:默认的.compact()是封装好的快捷方法,需要手动构建格式,先关闭默认级别输出,再替换为自定义字段。
  3. 复用原格式其他逻辑:除级别外,目标、行号、日志内容等字段保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:12:25