更改env_logger使用的时间戳格式

时间:2018-02-18 09:57:35

标签: logging rust timestamp format

以下最小例子

#[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");
}

itertools

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

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

这目前不可能¹。

虽然可以使用Formatter更改记录消息的格式,但此格式化程序会将日志消息的时间戳记作为TimestampTimestamp只实现DebugDisplay,没有额外的方法。该文档没有提到配置日期显示方式的方法。它只提到该类表示“An RFC3339格式化的时间戳”。此RFC定义了显示日期的方式。您想要的格式与RFC不兼容(最重要的是,它缺少时区,请不要在没有时区的情况下记录日期时间)。

RFC确实允许crate当前使用的更精确。最近在名为"Make the timestamp format more compact"的拉取请求中删除了此功能。在我看来,更精确有时是有用的,你可以打开一个问题,要求Timestamp允许该选项。 RFC也不允许省略日期和时间之间的T

查看两个特征(DebugDisplay)的实现表明该表示确实是固定的。

1:嗯,您可以忽略env_logger的日期,如果您真的想要,可以自己动手。我不确定会有多糟糕。

答案 1 :(得分:0)

这在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");
}

更多信息:Include timestamp in log messages