如何在rust stderr中添加时间戳

hjzp0vay  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(94)

我使用时雄作为stdout的标准,并使用env_logger作为stdout的标准。
所以在stdout中清除事件发生的时间:[2023-11-29T02:30:03Z INFO myapp] connected success
但是在stderr中只出现了panic:Error: Io(Os { code: 111, kind: ConnectionRefused, message: "Connection refused" })
如何使错误日志更有信息性?(例如时间戳)
比如我的代码

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

#[tokio::main]
async fn main() {
    let mut builder = Builder::from_default_env();
    builder.target(Target::Stdout);
    builder.init();
    warn!("my test connected");

    TcpStream::connect("127.0.0.1:3030").await.unwrap();
}

字符串

ifmq2ha2

ifmq2ha21#

以下是实现此目标的分步指南:
1.确保Cargo.toml中的依赖项:首先,确保Cargo.toml文件中有env_logger作为依赖项。

[dependencies]
env_logger = "0.9"  # Check for the latest version
tokio = { version = "1", features = ["full"] }

字符串
1.配置env_logger:在主函数中或者在启动javascript代码之前,配置env_logger。您可以使用Builder自定义格式,包括时间戳。

use env_logger::Builder;
use std::io::Write;

fn main() {
    Builder::new()
        .format(|buf, record| writeln!(buf, "{}: {}", chrono::Utc::now().to_rfc3339(), record.args()))
        .init();

    // Your async tokio code here
}


在这个例子中,我使用chrono作为时间戳。如果你选择使用chrono,请确保将其添加到依赖项中:

[dependencies]
chrono = "0.4"  # Check for the latest version


1.日志错误:在记录错误时,请确保使用log提供的记录宏,这是env_logger的依赖项。这可以确保env_logger捕获日志并相应地格式化。

log::error!("Error: {:?}", your_error_here);


1.运行您的应用:在运行应用时,您可以通过环境变量来控制日志级别和目标,例如:

RUST_LOG=error cargo run


这将确保捕获所有错误日志并显示时间戳。
要使用时雄和env_logger在Rust代码中的panic消息中添加时间戳,您可以使用自定义panic hook沿着chrono来生成时间戳,就像我在下面的代码中突出显示的那样。

use std::panic;
use chrono::Utc;

fn main() {
    // Set up the custom panic hook
    panic::set_hook(Box::new(|panic_info| {
        // Get the current timestamp
        let timestamp = Utc::now().to_rfc3339();
        // Print the panic message with the timestamp
        if let Some(s) = panic_info.payload().downcast_ref::<&str>() {
            eprintln!("{}: Panic occurred: {}", timestamp, s);
        } else {
            eprintln!("{}: Panic occurred", timestamp);
        }
    }));

    // Rest of your main function...
}


看这里:https://docs.rs/chrono/latest/chrono/struct.DateTime.html为日期时间在计时

相关问题