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

为何调试打印env_logger::Builder会显示“Logger { ... }”?

问题

测试代码如下:

use env_logger::Builder;

fn main() {
    let mut builder = Builder::new();
    println!("{:?}", builder);
}

调试输出为:

Logger { filter: Filter { filter: None, directives: [] }, writer: Builder { target: stderr, write_style: Auto, is_test: false, built: false } }

明明查看env_logger的logger.rs源码时,Builder::new()返回的是Builder结构体:

#[derive(Default)]
pub struct Builder {
    filter: env_filter::Builder,
    writer: writer::Builder,
    format: fmt::Builder,
    built: bool,
}
impl Builder {
    pub fn new() -> Builder {
        Default::default()
    }
}

但打印结果却是Logger结构体,这是为什么?

解答

核心原因是你实际使用的env_logger版本和查看的源码版本不一致。

你查看的是某个旧版本env_logger的logger.rs代码,其中Builder::new()确实返回Builder结构体;但你项目中依赖的env_logger是较新的版本,在这个版本的设计中,顶层导出的Builder已经被调整:

  • 要么是Builder::new()方法的返回值类型改为了Logger;
  • 要么是顶层的Builder其实是Logger的别名或内部包装结构体,其Debug输出会显示为Logger。

你可以在项目中执行cargo doc --open,查看本地依赖的env_logger官方文档,确认Builder::new()的返回类型以及Builder结构体的定义,就能明确版本间的差异。

内容的提问来源于stack exchange,提问作者王老吉

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:48:22