use log::{debug, error, info, warn, LevelFilter}; use simplelog::*; use std::fs::{create_dir_all, File, OpenOptions}; use std::path::Path; const MAX_LOG_SIZE: u64 = 50 * 1024 * 1024; const LOG_FILE_PATH: &str = "data/rust.log"; pub fn init_logger() { let mut builder = ConfigBuilder::new(); builder.set_time_offset_to_local().unwrap(); let config = builder.build(); // 获取文件的目录路径 let dir = Path::new(LOG_FILE_PATH).parent().unwrap(); // 检查并创建目录 if !dir.exists() { create_dir_all(dir).unwrap(); } let file = OpenOptions::new() .write(true) .append(true) .create(true) .open(LOG_FILE_PATH).unwrap(); CombinedLogger::init( vec![ TermLogger::new(LevelFilter::Info, config.clone(), TerminalMode::Mixed, ColorChoice::Auto), WriteLogger::new(LevelFilter::Info, config.clone(), file), ] ).unwrap(); } // 检查文件大小并清空文件(如果超出限制) fn check_and_clear_log_file() { let metadata = std::fs::metadata(LOG_FILE_PATH).unwrap(); if metadata.len() > MAX_LOG_SIZE { // 清空文件 File::create(LOG_FILE_PATH).expect(&format!("Can't re-create file {}", LOG_FILE_PATH)); } } #[allow(dead_code)] pub fn debug(message: &str) { check_and_clear_log_file(); debug!("{}", message); } #[allow(dead_code)] pub fn info(message: &str) { check_and_clear_log_file(); info!("{}", message); } #[allow(dead_code)] pub fn warn(message: &str) { check_and_clear_log_file(); warn!("{}", message); } #[allow(dead_code)] pub fn error(message: &str) { check_and_clear_log_file(); error!("{}", message); }