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,运行结果如下:
相关文章推荐
- logz.io一个企业级的ELK日志分析器 内部集成了机器学习识别威胁——核心:利用用户对于特定日志事件的反馈处理动作来学习判断日志威胁 + 类似语音识别的专家系统从各方收集日志威胁信息
- Marklogic学习 —— 日志Log处理
- 系统架构学习日志2-Log structured vs Journaling File System
- mysql dba系统学习(10)innodb引擎的redo log日志的原理
- iptables学习与研究(使用LOG记录失败日志)
- Rust日志学习(四)——simplelog
- Rust日志学习(五)—— log4rs
- Vue学习日志:初识VUE(1)
- iptables学习与研究(使用LOG记录失败日志)
- Spring学习笔记(三十):关于org.slf4j.logger的日志打印log.info(string,object)
- Web学习-apache查看log日志
- Rust日志学习(三)——simple_logger
- Android log日志类型 学习
- java日志系统学习--java.util.log.Level
- 《视觉SLAM十四讲》学习日志(二)——初识SLAM
- CodeIgniter框架源码学习之日志类--Log.php
- 3、Qt学习笔记--日志文件(log)
- java日志系统学习--java.util.log.Level
- Log日志框架的学习.正确使用日志的10个技巧
- mysql dba系统学习(8)查询日志文件功能 mysql dba系统学习(9)slow query log慢查询日志功能