前言
日誌是經常用的,與別的語言一樣,Rust也有日誌庫log,實現了日誌分級、日誌過濾、日誌輸出格式化、日誌復原等功能。Github地址:https://github.com/rust-lang-nursery/log Rust log
log的最基本的用法是通過5個宏來實現的,分別是: [error!], [warn!], [info!], [debug!] ,[trace!]。
//levels of the loggingpub enum LogLevel { Error, //error是日誌分級的最高等級 Warn, Info, Debug, Trace, //trace是最低等級}
對於如何自訂分級,暫不涉及,自訂分級的話,當項目比較大,涉及很多庫時,如果多個庫自訂分級,最後日誌是很難處理的,所以當多個庫都涉及日誌時,不同庫的日誌分級不同,會有問題,所以不建議自訂日誌分級,除非當前分級不滿足項目需求時才考慮自訂的問題。
與日誌level相關的還有一個日誌過濾,以後會用到:
//level filters of the logging frameworkpub enum LogLevelFilter { Off, Error, Warn, Info, Debug, Trace,}
下面的樣本展示類log最基本的用法:
#[macro_use]extern crate log;use log::LogLevel;//日誌等級fn main() { log_lever_fn();}fn log_lever_fn(){ let data=(42,"Forty-two"); let private_data="private"; log!(LogLevel::Error,"Received errors:{},{}",data.0,data.1); log!(target:"app_events",LogLevel::Warn,"App warning:{},{},{}",data.0,data.1,private_data); let (err_info,port)=("No connection",22); error!("Error:{} on port {}",err_info,port);}
下面這段原始碼有些難讀,可以參考這裡:https://kaisery.gitbooks.io/rust-book-chinese/content/content/Macros%20%E5%AE%8F.html
//log宏原始碼/// This macro will generically log with the specified `LogLevel` and `format!`/// based argument list.#[macro_export]macro_rules! log { (target: $target:expr, $lvl:expr, $($arg:tt)+) => ({ static _LOC: $crate::LogLocation = $crate::LogLocation { __line: line!(), __file: file!(), __module_path: module_path!(), }; let lvl = $lvl; if lvl <= $crate::__static_max_level() && lvl <= $crate::max_log_level() { $crate::__log(lvl, $target, &_LOC, format_args!($($arg)+)) } }); ($lvl:expr, $($arg:tt)+) => (log!(target: module_path!(), $lvl, $($arg)+))}
下面是error宏原始碼,其他幾個等級宏類似,這裡不一一列出,更多源碼參考:https://docs.rs/crate/log/0.3.8/source/src/macros.rs
//Logs a message at the error level.#[macro_export]macro_rules! error { (target: $target:expr, $($arg:tt)*) => ( log!(target: $target, $crate::LogLevel::Error, $($arg)*); ); ($($arg:tt)*) => ( log!($crate::LogLevel::Error, $($arg)*); )} logger
僅僅用log很多情況下是不滿足功能需求的,日誌不同的功能要靠不同的logger實現,下面是目前較常用的logger: Simple minimal loggers:
env_logger——A logger configured via an environment variable(通過環境變數進行日誌配置) simple_logger simplelog pretty_env_logger stderrlog flexi_logger Complex configurable frameworks:
log4rs fern Adaptors for other facilities:
syslog slog-stdlog
實際工程應用中需要根據不同的需求選用不同的logger。下面以env_logger為例:
#[macro_use]extern crate log;//在Cargo.toml的[dependency]項中添加對應項extern crate env_logger;//logger的一種fn main() { env_logger_fn();}fn env_logger_fn(){ env_logger::init().unwrap();//Initializes the global logger with an env logger. info!("starting up"); error!("error:{}",404);}
//Cargo.toml[dependencies]log = "0.3"env_logger = "0.4.3"
編譯、運行結果:
通過環境變數設定日誌等級為info level,運行結果如下: