配置日志记录
启用每个模块的日志级别
创建两个模块:foo
,以及嵌套的foo::bar
,它们的记录指令,单独用RUST_LOG
环境变量控制。
#[macro_use] extern crate log; extern crate env_logger; mod foo { mod bar { pub fn run() { warn!("[bar] warn"); info!("[bar] info"); debug!("[bar] debug"); } } pub fn run() { warn!("[foo] warn"); info!("[foo] info"); debug!("[foo] debug"); bar::run(); } } fn main() { env_logger::init(); warn!("[root] warn"); info!("[root] info"); debug!("[root] debug"); foo::run(); }
RUST_LOG
环境变量,控制env_logger
输出。模块声明采用逗号分隔项,格式如下path::to::module=log_level
。 运行test
应用如下:
RUST_LOG="warn,test::foo=info,test::foo::bar=debug" ./test
设置默认值log::Level
为warn
,而模块foo
和模块foo::bar
则分别为info
和debug
。
WARN:test: [root] warn
WARN:test::foo: [foo] warn
INFO:test::foo: [foo] info
WARN:test::foo::bar: [bar] warn
INFO:test::foo::bar: [bar] info
DEBUG:test::foo::bar: [bar] debug
使用自定义环境变量,设置日志记录
Builder
配置日志记录。
Builder::parse
解析MY_APP_LOG
环境变量内容,变为RUST_LOG
语法形式。然后,Builder::init
初始化记录器。所有这些步骤,通常都是由env_logger::init
内部完成。
#[macro_use] extern crate log; extern crate env_logger; use std::env; use env_logger::Builder; fn main() { Builder::new() .parse(&env::var("MY_APP_LOG").unwrap_or_default()) .init(); info!("informational message"); warn!("warning message"); error!("this is an error {}", "message"); }
在日志消息中,包含时间戳
使用Builder
创建一个自定义记录器配置。 每次记录都调用Local::now
,获取在本地时区的当前DateTime
,和使用DateTime::format
带上strftime::specifiers
,在最终记录中,格式化使用的时间戳。
示例:调用Builder::format
,它需要设置一个闭包函数,对每个消息文本格式化,添加时间戳,Record::level
和主体Record::args
)。
#[macro_use] extern crate log; extern crate chrono; extern crate env_logger; use std::io::Write; use chrono::Local; use env_logger::Builder; use log::LevelFilter; fn main() { Builder::new() .format(|buf, record| { writeln!(buf, "{} [{}] - {}", Local::now().format("%Y-%m-%dT%H:%M:%S"), record.level(), record.args() ) }) .filter(None, LevelFilter::Info) .init(); warn!("warn"); info!("info"); debug!("debug"); }
stderr 输出,将包含
2017-05-22T21:57:06 [WARN] - warn
2017-05-22T21:57:06 [INFO] - info
将消息记录,到自定义位置
log4rs能配置日志记录,输出到自定义的位置。log4rs可以使用外部 yaml 文件,或一个生成器配置。
使用log4rs::append::file::FileAppender
创建一个日志配置。该配置继续使用来自log4rs::encode::pattern
的自定义模式,进行编码,要知道,这个配置其实是定义日录记录目标的附加项。待会,还要将附加项配置,分配给log4rs::config::Config
,并设置默认值log::LevelFilter
。
# #[macro_use] # extern crate error_chain; #[macro_use] extern crate log; extern crate log4rs; use log::LevelFilter; use log4rs::append::file::FileAppender; use log4rs::encode::pattern::PatternEncoder; use log4rs::config::{Appender, Config, Root}; # # error_chain! { # foreign_links { # Io(std::io::Error); # LogConfig(log4rs::config::Errors); # SetLogger(log::SetLoggerError); # } # } fn run() -> Result<()> { let logfile = FileAppender::builder() .encoder(Box::new(PatternEncoder::new("{l} - {m}\n"))) .build("log/output.log")?; let config = Config::builder() .appender(Appender::builder().build("logfile", Box::new(logfile))) .build(Root::builder() .appender("logfile") .build(LevelFilter::Info))?; log4rs::init_config(config)?; info!("Hello, world!"); Ok(()) } # # quick_main!(run);