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

如何为Rust的stderr错误日志添加时间戳(tokio+env_logger场景)

给Rust异步代码中的Panic日志添加时间戳

你的问题核心在于:unwrap()触发的panic由Rust默认处理逻辑直接输出到stderr,没有经过env_logger的格式化流程,因此缺失时间戳等日志元信息。以下是两种可行的解决思路:

方案一:自定义Panic Hook

通过替换默认的panic处理钩子,将panic信息转发到env_logger的日志系统,复用已配置的日志格式(包含时间戳、日志级别等)。

修改后的完整代码:

use env_logger::{Builder, Target, Env};
use tokio::net::TcpStream;
use log::error;

#[tokio::main]
async fn main() {
    // 初始化env_logger,可通过环境变量调整日志级别,默认输出到stdout
    let mut builder = Builder::from_env(Env::default().default_filter_or("warn"));
    builder.target(Target::Stdout);
    builder.init();

    // 注册自定义panic处理钩子
    std::panic::set_hook(Box::new(|panic_info| {
        let location = panic_info.location().unwrap_or_else(|| {
            // 极端情况无法获取位置时的 fallback
            std::panic::Location::caller()
        });
        let panic_msg = panic_info.payload()
            .downcast_ref::<&str>()
            .unwrap_or(&"Unknown panic reason");

        // 用error级别输出,自动带上时间戳等格式
        error!(
            "Panic triggered: {} | at {}:{}",
            panic_msg,
            location.file(),
            location.line()
        );
    }));

    warn!("my test connected");

    // 触发panic时会使用自定义钩子输出格式化日志
    TcpStream::connect("127.0.0.1:3030").await.unwrap();
}

方案二:显式处理错误(推荐)

遵循Rust的错误处理规范,避免使用unwrap(),手动捕获错误并通过log宏输出,这样日志会自动带上时间戳:

use env_logger::{Builder, Target, Env};
use tokio::net::TcpStream;
use log::{warn, error};

#[tokio::main]
async fn main() {
    let mut builder = Builder::from_env(Env::default().default_filter_or("warn"));
    builder.target(Target::Stdout);
    builder.init();

    warn!("my test connected");

    match TcpStream::connect("127.0.0.1:3030").await {
        Ok(_) => log::info!("Connection succeeded"),
        Err(e) => error!("Connection failed: {}", e),
    }
}

方案对比

  • 方案一:适合需要保留panic流程的场景,能捕获所有未处理的panic,统一日志格式
  • 方案二:更符合Rust惯用写法,避免程序意外崩溃,错误处理更可控

内容的提问来源于stack exchange,提问作者ggoha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:21:14