Rust轻量级日志库simple-logging的使用,simple-logging提供简洁高效的日志记录功能
Rust轻量级日志库simple-logging的使用,simple-logging提供简洁高效的日志记录功能
simple-logging是一个为Rust的log
facade提供的简单日志记录器。它会将每条日志信息单独写为一行,每行包含日志记录时间、日志级别和线程ID。
示例
基本使用
大多数用户只需要调用log_to_file()
函数并指定日志文件路径和最低日志级别:
use log::LevelFilter;
simple_logging::log_to_file("test.log", LevelFilter::Info);
或者使用log_to_stderr()
将日志输出到标准错误流:
use log::LevelFilter;
simple_logging::log_to_stderr(LevelFilter::Info);
高级控制
如果需要更多控制,可以使用log_to()
函数,它可以接受任何实现了Write + Send + 'static
特性的输出目标:
use log::LevelFilter;
use std::io;
simple_logging::log_to(io::sink(), LevelFilter::Info);
完整示例代码
下面是一个完整的示例,展示如何使用simple-logging记录日志:
#[macro_use]
extern crate log;
use log::LevelFilter;
use simple_logging;
fn main() {
// 初始化日志记录器,将日志写入test.log文件,记录Info及以上级别的日志
simple_logging::log_to_file("test.log", LevelFilter::Info)
.expect("无法初始化日志记录器");
// 记录不同级别的日志
trace!("这是一条trace级别的日志"); // 不会记录,因为级别低于Info
debug!("这是一条debug级别的日志"); // 不会记录
info!("这是一条info级别的日志"); // 会记录
warn!("这是一条warn级别的日志"); // 会记录
error!("这是一条error级别的日志"); // 会记录
// 示例日志输出格式:
// [2023-01-01T12:34:56Z INFO main] 这是一条info级别的日志
// [2023-01-01T12:34:56Z WARN main] 这是一条warn级别的日志
// [2023-01-01T12:34:56Z ERROR main] 这是一条error级别的日志
}
要使用simple-logging,需要在Cargo.toml中添加依赖:
[dependencies]
log = "0.4"
simple-logging = "2.0.2"
simple-logging是一个轻量级、简单易用的日志库,特别适合需要基本日志功能而又不想引入复杂依赖的项目。
完整示例demo
下面是一个更完整的示例,展示如何在多线程环境中使用simple-logging:
#[macro_use]
extern crate log;
use log::{LevelFilter, info, warn, error};
use simple_logging;
use std::thread;
fn main() {
// 初始化日志记录器,将日志写入app.log文件
simple_logging::log_to_file("app.log", LevelFilter::Debug)
.expect("无法初始化日志记录器");
info!("应用程序启动"); // 会记录
// 在主线程中记录日志
warn!("主线程警告信息");
// 创建子线程记录日志
let handle = thread::spawn(|| {
debug!("子线程调试信息"); // 会记录,因为级别是Debug
error!("子线程错误信息");
});
handle.join().unwrap();
info!("应用程序结束");
}
日志输出示例:
[2023-01-01T10:00:00Z INFO main] 应用程序启动
[2023-01-01T10:00:00Z WARN main] 主线程警告信息
[2023-01-01T10:00:00Z DEBUG ThreadId(2)] 子线程调试信息
[2023-01-01T10:00:00Z ERROR ThreadId(2)] 子线程错误信息
[2023-01-01T10:00:00Z INFO main] 应用程序结束
这个示例展示了:
- 如何设置Debug级别日志记录
- 在主线程和子线程中记录日志
- 不同日志级别的使用
- 自动包含的线程ID信息
Rust轻量级日志库simple-logging使用指南
简介
simple-logging是一个轻量级的Rust日志库,提供了简洁高效的日志记录功能。它设计简单易用,适合需要基本日志功能而不想引入复杂依赖的项目。
主要特性
- 轻量级实现
- 支持标准日志级别(error, warn, info, debug, trace)
- 可配置的输出格式
- 线程安全的日志记录
- 与标准log crate兼容
使用方法
1. 添加依赖
首先在Cargo.toml
中添加依赖:
[dependencies]
log = "0.4"
simple-logging = "2.0"
2. 基本使用
use log::{info, error, warn};
fn main() {
// 初始化日志,设置日志级别为Info
simple_logging::log_to_file("my_app.log", log::LevelFilter::Info)
.expect("Failed to initialize logging");
info!("Application started");
warn!("This is a warning message");
error!("This is an error message");
// 低于Info级别的日志不会被记录
debug!("This debug message won't be logged");
}
3. 高级配置
use chrono::Local;
use log::LevelFilter;
fn main() {
// 自定义日志格式
simple_logging::log_to_file_with_format(
"custom.log",
LevelFilter::Debug,
|buf, record| {
let time = Local::now().format("%Y-%m-%d %H:%M:%S");
writeln!(
buf,
"[{}] [{}] {}:{} - {}",
time,
record.level(),
record.file().unwrap_or("unknown"),
record.line().unwrap_or(0),
record.args()
)
},
)
.expect("Failed to initialize logging");
debug!("Debug message with custom format");
info!("Info message with custom format");
}
4. 输出到标准输出
fn main() {
// 输出到标准输出而不是文件
simple_logging::log_to_stderr(log::LevelFilter::Trace);
trace!("This will be printed to stderr");
info!("So will this");
}
日志级别
simple-logging支持标准日志级别:
error!
- 错误信息warn!
- 警告信息info!
- 常规信息debug!
- 调试信息trace!
- 跟踪信息
性能考虑
simple-logging在设计上考虑了性能:
- 低于当前日志级别的日志会尽早被过滤掉
- 使用缓冲写入减少IO操作
- 简单的格式化开销低
示例项目结构
my_app/
├── Cargo.toml
└── src/
└── main.rs
在main.rs
中初始化日志后,可以在项目的任何地方使用log
宏记录日志,只要确保log
crate在作用域内。
注意事项
- 只能初始化一次日志系统,多次调用会返回错误
- 对于更复杂的需求,可以考虑
env_logger
或fern
等更全功能的日志库 - 生产环境中可能需要考虑日志轮转,simple-logging本身不提供这个功能
simple-logging非常适合小型项目或需要快速集成日志功能的场景,它的简洁性使得学习和使用成本极低。
完整示例demo
下面是一个完整的simple-logging使用示例,展示了文件日志记录、自定义格式和标准输出日志:
// 导入必要的库
use log::{error, warn, info, debug, trace};
use chrono::Local;
use log::LevelFilter;
fn main() {
// 示例1: 基本文件日志记录
simple_logging::log_to_file("basic.log", LevelFilter::Debug)
.expect("Failed to initialize basic logging");
info!("This is a basic info message");
debug!("This debug message will appear in basic.log");
// 示例2: 自定义日志格式
simple_logging::log_to_file_with_format(
"custom_format.log",
LevelFilter::Trace,
|buf, record| {
let time = Local::now().format("%Y-%m-%d %H:%M:%S");
writeln!(
buf,
"[{}] [{}] {}:{} - {}",
time,
record.level(),
record.file().unwrap_or("unknown"),
record.line().unwrap_or(0),
record.args()
)
},
)
.expect("Failed to initialize custom format logging");
trace!("This trace message has custom format");
// 示例3: 标准错误输出
simple_logging::log_to_stderr(LevelFilter::Info);
warn!("This warning goes to stderr");
// 演示不同日志级别
log_examples();
}
fn log_examples() {
error!("This is an error message");
warn!("This is a warning message");
info!("This is an info message");
debug!("This is a debug message");
trace!("This is a trace message");
}
对应的Cargo.toml
文件内容:
[package]
name = "simple_logging_demo"
version = "0.1.0"
edition = "2021"
[dependencies]
log = "0.4"
simple-logging = "2.0"
chrono = "0.4"
这个完整示例展示了:
- 基本的文件日志记录功能
- 自定义日志格式的功能
- 标准错误输出的配置
- 不同日志级别的使用方法
- 项目结构和依赖配置
运行后会生成两个日志文件:
basic.log
- 包含基本日志信息custom_format.log
- 包含自定义格式的详细日志信息
同时部分日志会输出到标准错误流(stderr)。