以下最小例子
#[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");
}
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
我怎样才能做到这一点?
答案 0 :(得分:3)
这目前不可能¹。
虽然可以使用Formatter
更改记录消息的格式,但此格式化程序会将日志消息的时间戳记作为Timestamp
。 Timestamp
只实现Debug
和Display
,没有额外的方法。该文档没有提到配置日期显示方式的方法。它只提到该类表示“An RFC3339格式化的时间戳”。此RFC定义了显示日期的方式。您想要的格式与RFC不兼容(最重要的是,它缺少时区,请不要在没有时区的情况下记录日期时间)。
RFC确实允许crate当前使用的更精确。最近在名为"Make the timestamp format more compact"的拉取请求中删除了此功能。在我看来,更精确有时是有用的,你可以打开一个问题,要求Timestamp
允许该选项。 RFC也不允许省略日期和时间之间的T
。
查看两个特征(Debug
和Display
)的实现表明该表示确实是固定的。
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");
}