rust 更改env_logger使用的时间戳格式

qrjkbowd  于 2023-02-04  发布在  其他
关注(0)|答案(3)|浏览(348)

下面的最小示例

#[macro_use]
extern crate log;
extern crate env_logger;

fn main() {
    std::env::set_var("MY_LOG_LEVEL", "info");
    env_logger::init_from_env("MY_LOG_LEVEL");
    info!("hi");
}

outputs

INFO 2018-02-18T09:59:20Z: playground: hi

我想使用不同的格式("%Y-%m-%d %H:%M:%S%.3f"):

INFO 2018-02-18 09:59:20.123: playground: hi

我怎样才能做到这一点?

jgwigjjp

jgwigjjp1#

目前尚不可能¹。
虽然可以使用Formatter来更改日志消息的格式,但此格式化程序将日志消息的时间戳作为Timestamp提供。Timestamp仅实现DebugDisplay,没有额外的方法。文档没有提到如何配置日期的显示方式。它只提到类表示“RFC3339的时间戳””。此RFC定义显示日期的方式。您需要的格式与RFC不兼容(最重要的是,它缺少时区,请,* 请勿记录没有时区的日期时间 *,请)。
RFC确实允许比板条箱当前使用的更精确。这个特性在最近一个名为"Make the timestamp format more compact"的拉取请求中被删除。在我看来,更精确有时是有用的,你可以打开一个问题,要求Timestamp允许该选项。RFC也不允许省略日期和时间之间的T
查看这两个trait(DebugDisplay)的实现可以看出,其表示确实是固定的。
1:嗯,你可以忽略env_logger的日期,如果你真的想的话,你可以自己找一个。我不知道那会有多糟糕。

gab6jxml

gab6jxml2#

现在可以使用env_logger = "0.10"实现这一点。

env_logger::builder()
    // setting this to None disables the timestamp
    .format_timestamp(Some(env_logger::TimestampPrecision::Millis))
    .init();
env_logger::builder()
    //.format_timestamp_secs()
    .format_timestamp_millis()
    //.format_timestamp_micros()
    //.format_timestamp_nanos()
    .init();

参见TimestampPrecision和格式时间戳。

jecbmhm3

jecbmhm33#

这在Rust 1.45.2中是可能的:

use chrono::Local;
use env_logger::Builder;
use log::LevelFilter;
use std::io::Write;

fn main() {
    Builder::new()
        .format(|buf, record| {
            writeln!(
                buf,
                "{} {}: {}",
                record.level(),
                //Format like you want to: <-----------------
                Local::now().format("%Y-%m-%d %H:%M:%S%.3f"),
                record.args()
            )
        })
        .filter(None, LevelFilter::Info)
        .init();

    log::warn!("warn");
    log::info!("info");
    log::debug!("debug");
}

更多信息:在日志消息中包含时间戳

相关问题