log4rs
介紹
log4rs
是一個(gè)高效的日志庫框架跺嗽,借鑒了 java 的 Logback 和 log4j萎馅。
log4rs
能做什么宏所?提供了輸出到文件和控制臺(tái)兩種方式竟闪。
大部分用戶會(huì)使用控制臺(tái)輸出,在 linux 中輸出到控制臺(tái)信息可以重定向到文件仇祭,靈活度高。
輸出到文件時(shí)颈畸,你可能需要限制文件大小前塔,文件拆分,文件回滾功能承冰,這些log4rs
都提供了华弓。
使用
log4rs
支持兩種配置方式,基于編程方式配置和基于YAML文件配置困乒。 如果需要頻繁修改配置的寂屏,建議使用YAML文件配置,這有效減少重新編譯次數(shù)。
基于編程方式配置
#[macro_use]
extern crate log;
extern crate log4rs;
use log::LevelFilter;
use log4rs::append::console::ConsoleAppender;
use log4rs::append::file::FileAppender;
use log4rs::encode::pattern::PatternEncoder;
use log4rs::config::{Appender, Config, Logger, Root};
fn init_log() {
let stdout = ConsoleAppender::builder()
.encoder(Box::new(PatternEncoder::new("[Console] doossmj - {l} -{t} - {m}{n}")))
.build();
let file = FileAppender::builder()
.encoder(Box::new(PatternEncoder::new("[File] bbtalrh - {l} - {t} - {m}{n}")))
.build("log/test.log")
.unwrap();
let config = Config::builder()
.appender(Appender::builder().build("stdout", Box::new(stdout)))
.appender(Appender::builder().build("file", Box::new(file)))
.logger(Logger::builder()
.appender("file")
.additive(false)
.build("app", LevelFilter::Info))
.build(Root::builder().appender("stdout").build(LevelFilter::Info))
.unwrap();
let _ = log4rs::init_config(config).unwrap();
}
fn main() {
init_log();
trace!("A trace");
debug!("A debug");
info!("A info");
info!(target:"app", "File info");
warn!("A warn");
error!("A error");
}
上面代碼根據(jù)輸出目標(biāo)不同迁霎,分別輸出到控制臺(tái)和文件吱抚。
-
appender
控制輸出到什么地方去,例子添加了輸出到文件和控制臺(tái)考廉。 -
encoder
按什么格式輸出秘豹,在appender
中配置。 -
logger
日志實(shí)例昌粤,例子構(gòu)建了一個(gè)輸出到文件既绕,目標(biāo)為app
的日志實(shí)例。
并構(gòu)建了一個(gè)全局日志實(shí)例涮坐,它輸出到控制臺(tái)凄贩。所以上面代碼運(yùn)行后控制臺(tái)輸出是
[Console] 2019-04-16T20:55:34.434982200+08:00 - INFO -u_log4rs - A info
[Console] 2019-04-16T20:55:34.436987600+08:00 - WARN -u_log4rs - A warn
[Console] 2019-04-16T20:55:34.438002100+08:00 - ERROR -u_log4rs - A error
文件:
[File] 2019-04-16T20:55:34.436987600+08:00 - INFO - app - File info
因?yàn)?info!(target:"app", "File info");
這代碼執(zhí)行時(shí),與文件輸出方式匹配袱讹。
基于YAML文件配置
把前面的例子翻譯成YAML文件疲扎,就是如下:
appenders:
# An appender named "stdout" that writes to stdout
stdout:
kind: console
encoder:
pattern: "[Console] ebqqpv1 - {l} -{t} - {m}{n}"
# An appender named "file" that writes to a file with a custom pattern encoder
file:
kind: file
path: "log/test.log"
encoder:
pattern: "[File] njmmxdi - {l} - {t} - {m}{n}"
# Set the default logging level to "warn" and attach the "stdout" appender to the root
root:
level: info
appenders:
- stdout
loggers:
# Route log events sent to the "app" logger to the "file" appender,
# and *not* the normal appenders installed at the root
app:
level: info
appenders:
- file
additive: false
讀取配置文件,并記錄:
#[macro_use]
extern crate log;
extern crate log4rs;
fn main() {
log4rs::init_file("log4rs.yml", Default::default()).unwrap();
trace!("A trace");
debug!("A debug");
info!("A info");
info!(target:"app", "File info");
warn!("A warn");
error!("A error");
}
輸出和前例子一致捷雕,而代碼簡潔多了椒丧。