Rust log初識_rust

來源:互聯網
上載者:User
前言

日誌是經常用的,與別的語言一樣,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,運行結果如下:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.