您的位置:首页 > 其它

Rust日志学习(一)—— 初识Rust log

2017-10-16 15:35 3443 查看

前言

日志是经常用的,与别的语言一样,Rust也有日志库log,实现了日志分级、日志过滤、日志输出格式化、日志回滚等功能,不足之处是Rust log的学习资料太少,基本只能看官方文档,但官方文档写的真心不太友好,至少与python的logging比起来差很多。实例也较少,虽然有些不足,但依然值得学习。

Github地址:https://github.com/rust-lang-nursery/log

log文档:https://docs.rs/log/0.3.8/log/

另外,值得注意的是,目前rust log还在不断更新中,有可能会出现文档与Github上的代码对应不上的问题,看来Rust还太年轻啊。

Rust log基础

log的最基本的用法是通过5个宏来实现的,分别是: [
error!
], [
warn!
], [
info!
], [
debug!
] ,[
trace!
]。

//levels of the logging
pub enum LogLevel {
Error,         //error是日志分级的最高等级
Warn,
Info,
Debug,
Trace,         //trace是最低等级
}


对于如何自定义分级,暂不涉及,自定义分级的话,当项目比较大,涉及很多库时,如果多个库自定义分级,最后日志是很难处理的,所以当多个库都涉及日志时,不同库的日志分级不同,会有问题,所以不建议自定义日志分级,除非当前分级不满足项目需求时才考虑自定义的问题。

与日志level相关的还有一个日志过滤,以后会用到:

//level filters of the logging framework
pub 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,运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  rust log