use std::{fs, path::Path, thread, time::Duration};
fn main() {
let log_level = "trace"; let log_max = "100k";
let log_file = "app.log";
let log_dir = "logs";
let enable_console_log = true;
log_full::parse_level(log_level).unwrap();
log_full::parse_size(log_max).unwrap();
let log_file_path = if log_dir.is_empty() {
log_file.to_string()
} else {
if let Err(e) = fs::create_dir_all(log_dir) {
eprintln!("Failed to create log directory {}: {}", log_dir, e);
}
Path::new(log_dir)
.join(log_file)
.to_string_lossy()
.to_string()
};
let builder = log_full::Builder::new()
.level_str(log_level)
.unwrap()
.log_file(log_file_path)
.log_file_max_str(log_max)
.unwrap()
.use_console(enable_console_log)
.use_async(true)
.show_process_id(true) .show_thread_info(true) .show_module_path(true) .highlight_keywords(vec!["ERROR".to_string(), "WARN".to_string(), "重要".to_string(),"关键词".to_string(),"线程".to_string()]);
builder.builder().unwrap();
println!("=== 日志配置完成,开始测试不同配置选项 ===");
println!("\n--- 测试1: 默认配置(显示所有信息) ---");
println!("=== 日志系统演示 ===");
log::trace!("这是一条 TRACE 级别的日志,用于最详细的调试信息");
log::debug!("这是一条 DEBUG 级别的日志,包含调试信息: {}", "调试数据");
log::info!("这是一条 INFO 级别的日志,记录程序运行状态");
log::warn!("这是一条 WARN 级别的日志,表示潜在问题: {}", "警告信息");
log::error!("这是一条 ERROR 级别的日志,记录错误: {}", "错误详情");
println!("\n--- 测试关键词高亮功能 ---");
log::info!("这条日志包含关键词 ERROR,应该被高亮显示");
log::info!("这条日志包含关键词 WARN,也应该被高亮显示");
log::info!("这是一条重要的系统消息,包含中文关键词");
log::info!("普通日志消息,不包含任何关键词");
log::error!("严重 ERROR: 数据库连接失败,这是一个重要的错误信息");
println!("\n--- 配置说明 ---");
println!("当前配置:");
println!(" - 显示进程ID: 是");
println!(" - 显示线程信息: 是");
println!(" - 显示模块路径: 是");
println!(" - 日志级别: {}", log_level);
println!("\n注意: 日志系统只能初始化一次,如需测试不同配置,请修改上述配置参数后重新运行程序。");
log::info!("用户登录: user_id={}, ip={}, timestamp={}", 12345, "192.168.1.100", "2024-08-14T18:23:46Z");
let handles: Vec<_> = (0..3).map(|i| {
thread::spawn(move || {
thread::sleep(Duration::from_millis(100 * i));
log::info!("线程 {} 执行完成", i);
})
}).collect();
for handle in handles {
handle.join().unwrap();
}
log::info!("日志演示完成,请查看控制台输出和日志文件: {}", log_dir);
log::logger().flush();
thread::sleep(Duration::from_millis(100));
}