Rust日志记录库free_log_client的使用,高效灵活的日志客户端实现与集成
Rust日志记录库free_log_client的使用,高效灵活的日志客户端实现与集成
安装
在项目目录中运行以下Cargo命令:
cargo add free_log_client
或者在Cargo.toml中添加以下行:
free_log_client = "0.5.0"
基本使用示例
use free_log_client::{Logger, LogLevel};
fn main() {
// 创建日志记录器实例
let logger = Logger::new();
// 记录不同级别的日志
logger.log(LogLevel::Info, "Application started");
logger.log(LogLevel::Debug, "Debugging information");
logger.log(LogLevel::Warning, "This is a warning");
logger.log(LogLevel::Error, "An error occurred");
// 也可以使用便捷方法
logger.info("User logged in");
logger.debug(format!("Current value: {}", 42));
logger.warn("Disk space low");
logger.error("Failed to connect to database");
}
高级配置示例
use free_log_client::{Logger, LogLevel, LogConfig};
use std::path::PathBuf;
fn main() {
// 创建自定义配置
let config = LogConfig {
log_file: Some(PathBuf::from("app.log")), // 指定日志文件
max_file_size: 10 * 1024 * 1024, // 10MB最大文件大小
max_backups: 5, // 保留5个备份文件
log_to_console: true, // 同时在控制台输出
min_log_level: LogLevel::Debug, // 最低记录级别为Debug
};
// 使用配置初始化日志记录器
let logger = Logger::with_config(config);
// 记录日志
logger.debug("Detailed debug information");
logger.info("System initialized successfully");
// 结构化日志记录
logger.with_fields(vec![
("user_id", "12345"),
("action", "file_upload"),
]).info("User performed action");
}
异步日志记录示例
use free_log_client::{Logger, LogLevel};
use tokio::runtime::Runtime;
async fn async_task(logger: &Logger) {
logger.info("Starting async task");
// 模拟一些工作
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
logger.info("Async task completed");
}
fn main() {
let logger = Logger::new();
let rt = Runtime::new().unwrap();
rt.block_on(async {
logger.info("Application started");
let tasks = vec![
async_task(&logger),
async_task(&logger),
async_task(&logger),
];
futures::future::join_all(tasks).await;
logger.info("All tasks completed");
});
}
日志过滤示例
use free_log_client::{Logger, LogLevel, LogFilter};
fn main() {
let logger = Logger::new()
.with_filter(LogFilter::new()
// 只记录来自特定模块的日志
.allow_module("my_app::database")
// 排除特定模块的调试日志
.deny_level_for_module("my_app::network", LogLevel::Debug)
// 设置全局最低日志级别
.min_level(LogLevel::Info));
// 这些日志会被记录
logger.module("my_app::database").info("Connected to DB");
logger.module("my_app::network").warn("Connection slow");
// 这些日志不会被记录
logger.module("my_app::network").debug("Packet received");
logger.module("my_app::utils").info("Utility function called");
}
完整示例demo
下面是一个结合了上述所有功能的完整示例:
use free_log_client::{Logger, LogLevel, LogConfig, LogFilter};
use std::path::PathBuf;
use tokio::runtime::Runtime;
// 异步任务示例
async fn perform_async_operation(logger: &Logger, task_id: i32) {
logger.info(&format!("Starting async task {}", task_id));
tokio::time::sleep(std::time::Duration::from_millis(500)).await;
logger.debug(&format!("Task {} in progress", task_id));
tokio::time::sleep(std::time::Duration::from_millis(500)).await;
logger.info(&format!("Async task {} completed", task_id));
}
fn main() {
// 创建自定义配置
let config = LogConfig {
log_file: Some(PathBuf::from("demo.log")),
max_file_size: 5 * 1024 * 1024, // 5MB
max_backups: 3,
log_to_console: true,
min_log_level: LogLevel::Debug,
};
// 初始化带过滤器的日志记录器
let logger = Logger::with_config(config)
.with_filter(LogFilter::new()
.allow_module("demo::core")
.deny_level_for_module("demo::network", LogLevel::Debug)
.min_level(LogLevel::Info));
// 同步日志记录
logger.module("demo::core").info("Application starting");
logger.module("demo::network").debug("This debug won't be logged"); // 会被过滤
logger.module("demo::core").debug("Core debug information");
// 结构化日志
logger.with_fields(vec![
("version", "1.0.0"),
("environment", "production"),
]).info("System initialized");
// 异步日志记录
let rt = Runtime::new().unwrap();
rt.block_on(async {
let tasks = (1..=3).map(|i| perform_async_operation(&logger, i));
futures::future::join_all(tasks).await;
logger.module("demo::core").info("All async tasks completed");
});
// 错误日志示例
match some_operation() {
Ok(_) => logger.info("Operation succeeded"),
Err(e) => logger.error(&format!("Operation failed: {}", e)),
}
}
fn some_operation() -> Result<(), String> {
// 模拟可能失败的操作
Err("Something went wrong".to_string())
}
free_log_client是一个高效灵活的Rust日志记录库,支持多种日志级别、文件输出、异步记录和灵活的过滤配置。通过简单的API,开发者可以轻松集成到各种Rust项目中。
1 回复
Rust日志记录库free_log_client的使用指南
介绍
free_log_client是一个高效灵活的Rust日志客户端库,专为需要轻量级但功能强大的日志记录解决方案的应用程序设计。它提供了简单的API接口,同时支持高度自定义的日志配置和输出方式。
主要特性
- 高性能异步日志记录
- 多日志级别支持
- 可定制的日志格式
- 多种输出目标(控制台、文件、网络等)
- 线程安全的实现
安装
在Cargo.toml中添加依赖:
[dependencies]
free_log_client = "0.3.0"
基本使用方法
1. 快速开始
use free_log_client::{Logger, LogLevel};
fn main() {
// 创建默认配置的logger
let logger = Logger::default();
// 记录不同级别的日志
logger.log(LogLevel::Info, "Application started");
logger.log(LogLevel::Debug, "Debug information");
logger.log(LogLevel::Error, "Something went wrong!");
}
2. 自定义配置
use free_log_client::{Logger, LogConfig, LogLevel, LogOutput};
fn main() {
// 创建自定义配置
let config = LogConfig {
level: LogLevel::Debug, // 只记录Debug及以上级别的日志
output: LogOutput::File("app.log".into()), // 输出到文件
format: Some("%t [%l] %m".into()), // 自定义格式: 时间戳 [级别] 消息
..Default::default()
};
let logger = Logger::with_config(config);
logger.log(LogLevel::Info, "Custom configuration initialized");
}
3. 多输出目标
use free_log_client::{Logger, LogConfig, LogLevel, LogOutput};
fn main() {
let config = LogConfig {
level: LogLevel::Info,
output: LogOutput::Multi(vec![
LogOutput::Console, // 输出到控制台
LogOutput::File("app.log".into()), // 同时输出到文件
]),
..Default::default()
};
let logger = Logger::with_config(config);
logger.log(LogLevel::Warning, "This will appear in both console and file");
}
4. 异步日志记录
use free_log_client::{Logger, LogLevel};
use std::thread;
fn main() {
let logger = Logger::default();
// 在多个线程中使用logger
let handles: Vec<_> = (0..5).map(|i| {
let logger = logger.clone();
thread::spawn(move || {
logger.log(LogLevel::Info, &format!("Thread {} logging", i));
})
}).collect();
for handle in handles {
handle.join().unwrap();
}
}
高级功能
自定义日志格式
支持以下占位符:
%t
- 时间戳%l
- 日志级别%m
- 日志消息%f
- 文件名%n
- 行号
use free_log_client::{Logger, LogConfig};
let config = LogConfig {
format: Some("[%t] %l @ %f:%n - %m".into()),
..Default::default()
};
let logger = Logger::with_config(config);
日志级别过滤
use free_log_client::{Logger, LogConfig, LogLevel};
let config = LogConfig {
level: LogLevel::Warning, // 只记录Warning及以上级别的日志
..Default::default()
};
let logger = Logger::with_config(config);
集成到现有项目
对于大型项目,建议创建一个全局可访问的logger实例:
use free_log_client::{Logger, LogLevel};
use lazy_static::lazy_static;
lazy_static! {
pub static ref LOGGER: Logger = Logger::default();
}
fn some_function() {
LOGGER.log(LogLevel::Debug, "Debugging some function");
}
fn main() {
some_function();
LOGGER.log(LogLevel::Info, "Main function completed");
}
性能建议
-
对于高频日志记录,使用
Debug
级别前检查是否启用:if logger.is_enabled(LogLevel::Debug) { logger.log(LogLevel::Debug, &expensive_to_compute_message()); }
-
考虑使用
LogOutput::Buffer
模式进行批量写入以提高性能 -
对于生产环境,建议将日志级别设置为
Info
或更高
free_log_client提供了灵活而强大的日志记录功能,可以根据项目需求进行各种定制。通过合理的配置,可以在不牺牲性能的情况下获得详细的运行时信息。
完整示例代码
下面是一个综合使用free_log_client各种功能的完整示例:
// 引入必要的模块
use free_log_client::{Logger, LogConfig, LogLevel, LogOutput};
use lazy_static::lazy_static;
use std::thread;
// 全局logger实例
lazy_static! {
static ref GLOBAL_LOGGER: Logger = Logger::with_config(LogConfig {
level: LogLevel::Debug,
output: LogOutput::Multi(vec![
LogOutput::Console,
LogOutput::File("application.log".into())
]),
format: Some("[%t] %l - %m (%f:%n)".into()),
..Default::default()
});
}
fn main() {
// 使用全局logger记录启动信息
GLOBAL_LOGGER.log(LogLevel::Info, "Application starting...");
// 检查Debug级别是否启用
if GLOBAL_LOGGER.is_enabled(LogLevel::Debug) {
GLOBAL_LOGGER.log(LogLevel::Debug, "Debug information available");
}
// 多线程日志记录示例
let handles: Vec<_> = (0..3).map(|i| {
thread::spawn(move || {
GLOBAL_LOGGER.log(LogLevel::Info, &format!("Thread {} started", i));
// 模拟工作
thread::sleep(std::time::Duration::from_millis(100));
GLOBAL_LOGGER.log(LogLevel::Info, &format!("Thread {} completed", i));
})
}).collect();
// 等待所有线程完成
for handle in handles {
handle.join().unwrap();
}
// 记录错误示例
match some_operation() {
Ok(_) => GLOBAL_LOGGER.log(LogLevel::Info, "Operation succeeded"),
Err(e) => GLOBAL_LOGGER.log(LogLevel::Error, &format!("Operation failed: {}", e)),
}
GLOBAL_LOGGER.log(LogLevel::Info, "Application shutting down");
}
fn some_operation() -> Result<(), String> {
// 模拟可能失败的操作
if rand::random() {
Ok(())
} else {
Err("Random failure occurred".to_string())
}
}
这个完整示例展示了:
- 全局logger实例的创建和配置
- 多输出目标(控制台和文件)
- 自定义日志格式
- 多线程安全日志记录
- 日志级别检查
- 错误处理场景的日志记录
要运行此示例,需要在Cargo.toml中添加以下依赖:
[dependencies]
free_log_client = "0.3.0"
lazy_static = "1.4.0"
rand = "0.8.5"