介绍
- log 只是一个最基础的框架,可以使用不同的具体实现
- env_logger 具体的 log 实现, 也可以使用其他实现
- tracing 可用于异步任务的应用级日志管理库
快速开始
rust
use std::process;
use env_logger::Builder;
use log::{debug, error, info, trace, warn, LevelFilter};
// 启动日志引擎
fn setup_logger() -> Result<(), Box<dyn std::error::Error>> {
// 创建日志构建器实例, 并且设置日志风格/过滤等级/输出位置
Builder::new()
.target(env_logger::Target::Stdout) // 默认输出到标准错误 Stderr, 输出到 Stderr 可以在测试中输出日志
.filter(None, LevelFilter::Trace) // 设置过滤等级, 默认是 Error, 也就是说低于error级别的日志都不会输出
.write_style(env_logger::WriteStyle::Auto) // 使用默认的输出风格(Always/Auto/Never)
.init();
Ok(())
}
fn main() {
// 如果无法初始化日志引擎就退出程序
if let Err(e) = setup_logger() {
eprintln!("Application error: Can not setup logger.\n{}", e);
process::exit(1);
}
trace!("some trace message");
debug!("some debug message");
info!("some info message");
warn!("some warn message");
error!("some error message");
}
rust
// 进程/文件处理
use std::{fs, io::Write, process};
// 处理时间日期
use chrono::Local;
// 处理日志
use env_logger::Builder;
use log::{LevelFilter, debug, error, info, trace, warn};
// 启动日志引擎
fn setup_logger_save_path() -> String {
// 处理日志保存路径(Cargo.toml 文件同级的 logs 目录下)
let save_path = "/logs/";
let mut log_file_path = String::new();
log_file_path.push_str(env!("CARGO_MANIFEST_DIR"));
log_file_path.push_str(save_path);
// 创建目录(如果不存在)
if fs::metadata(&log_file_path).is_err() {
fs::create_dir(&log_file_path).unwrap();
}
// 按日期保存日志(一天一个, 如果是不会自动退出的程序需要重启才行)
let today = Local::now().format("%Y-%m-%d").to_string();
log_file_path.push_str(&today);
log_file_path.push_str(".log");
log_file_path
}
// 将日志输出到文件
fn setup_logger() -> Result<(), Box<dyn std::error::Error>> {
let log_file_path = setup_logger_save_path();
// 根据日志文件路径创建文件
let log_file = Box::new(fs::File::create(log_file_path).unwrap());
// 创建日志构建器实例, 并且设置日志风格/过滤等级/输出位置
Builder::new()
.target(env_logger::Target::Pipe(log_file)) // 使用管道将输出重定向到文件
.filter(None, LevelFilter::Trace)
// .write_style(env_logger::WriteStyle::Never) // 使用默认的输出风格(Always/Auto/Never)
.format(|buf, record| {
// 不使用默认的输出格式, 自定义日志输出格式
writeln!(
buf,
"[{} {} {}:{}] {}",
Local::now().format("%Y-%m-%d %H:%M:%S%.3f"),
record.level(),
record.file().unwrap_or("unknown"),
record.line().unwrap_or(0),
record.args()
)
})
.init();
Ok(())
}
fn main() {
// 如果无法初始化日志引擎就退出程序
if let Err(e) = setup_logger() {
eprintln!("Application error: Can not setup logger.\n{}", e);
process::exit(1);
}
// 手动记录一些日志信息
trace!("some trace message");
debug!("some debug message");
info!("some info message");
warn!("some warn message");
error!("some error message");
}
toml
[dependencies]
log = "0.4.22"
env_logger = "0.11.5"
chrono = "0.4.38"