本文提供了一种通过log4rs
库记录日志的方法。这里没有采用读取yaml
文件的方式,而是通过对象构造的方式来初始化日志,用于发包时不带配置文件的场景。
初始化日志
在release环境,仅需要将日志打印到文件中,而日常开发时,为了方便调试代码,需要将日志同时打印到文件和终端控制台中,而且日志级别也不相同。可以通过如下宏判断环境。
#[cfg(debug_assertions)]
不同的环境采用不同的初始化方式。
use log::LevelFilter;
use log4rs::append::console::ConsoleAppender;
use log4rs::append::file::FileAppender;
use log4rs::config::{Appender, Config, Root};
use log4rs::encode::pattern::PatternEncoder;
use std::path::Path;
#[cfg(debug_assertions)]
pub fn init_log<P: AsRef<Path>>(log_path: P) {
let file = FileAppender::builder()
.encoder(Box::new(PatternEncoder::new(
"{d(%Y-%m-%d %H:%M:%S)}|{l}|{m}|{n}",
)))
.build(log_path)
.unwrap();
let stdout = ConsoleAppender::builder()
.encoder(Box::new(PatternEncoder::new(
"{d(%Y-%m-%d %H:%M:%S)}|{l}|{m}|{n}",
)))
.build();
let config = Config::builder()
.appender(Appender::builder().build("stdout", Box::new(stdout)))
.appender(Appender::builder().build("file", Box::new(file)))
.build(
Root::builder()
.appender("stdout")
.appender("file")
.build(LevelFilter::Debug),
)
.unwrap();
let _ = log4rs::init_config(config).unwrap();
}
#[cfg(not(debug_assertions))]
pub fn init_log<P: AsRef<Path>>(log_path: P) {
let file = FileAppender::builder()
.encoder(Box::new(PatternEncoder::new(
"{d(%Y-%m-%d %H:%M:%S)}|{l}|{m}|{n}",
)))
.build(log_path)
.unwrap();
let config = Config::builder()
.appender(Appender::builder().build("file", Box::new(file)))
.build(Root::builder().appender("file").build(LevelFilter::Info))
.unwrap();
}
单元测试
use log::debug;
use std::env;
#[test]
fn test_init_log() {
let log_path = env::current_dir().unwrap().join("tests/test.log");
init_log(log_path.as_path());
debug!("test_init_log")
}
打印的日志内容如下
2024-03-23 22:35:40|DEBUG|test_init_log|