Rust 日志创建及日志输出

175 阅读2分钟
技术方案概述:
  1. chrono:一个用于Rust的强大日期和时间库,提供时间处理的全面功能。查看详情
  2. log:一个轻量级、灵活的Rust日志框架,适用于各种日志需求。查看详情
  3. path::PathBuf, env, fs::OpenOptions:这些是Rust的基础库,用于处理文件路径、环境变量和文件操作。
  4. time:提供日期和时间功能的库,与Rust标准库完全兼容。查看详情
代码详解与配置
  1. Cargo.toml 配置

    log = "0.4.8"
    chrono = "0.4"
    time = "0.3"
    
  2. 获取执行路径 用于获取当前程序的可执行文件路径。若获取失败,程序将崩溃并显示错误信息。

    use chrono::Local;
    use log::LevelFilter;
    use simplelog::*;
    use std::{env, path::PathBuf, fs::OpenOptions};
    use time::UtcOffset;
    
    pub fn get_executable_path() -> PathBuf {
        env::current_exe().expect("无法获取可执行路径")
    }
    
  3. 创建日志文件 根据当前日期创建日志文件,如果文件已存在,则不重复创建。

    /// 获取当前可执行文件的路径,并在其父目录下创建名为"log"的目录。
    /// 使用本地日期格式化为"YYYY-MM-DD"来创建日志文件名。
    pub fn create_log_file() -> Result<std::fs::File, std::io::Error> {
        let exe_path = get_executable_path();
        let log_dir = exe_path.parent().unwrap().join("log");
        let date = Local::now().format("%Y-%m-%d").to_string();
        let log_dir_path = log_dir.join(format!("{}.log", date));
        OpenOptions::new().write(true).create(true).append(true).open(log_dir_path)
    }
    
  4. 初始化日志系统 初始化日志系统,确保日志目录存在,使用UTC+8时间偏移,并定制日志时间格式。

    /// 确保日志目录存在,并初始化日志系统
    pub fn init_logging() {
        let log_file = create_log_file();
        let offset = UtcOffset::from_hms(8, 0, 0).unwrap();
        match log_file {
            Ok(_file) => WriteLogger::init(LevelFilter::Info, ConfigBuilder::new()
                .set_time_offset(offset)
                .set_time_format_custom(format_description!("[year]-[month]-[day] [hour]:[minute]:[second].[subsecond digits:3]"))
                .set_target_level(LevelFilter::Off)
                .set_thread_level(LevelFilter::Off)
                .build(), _file).expect("错误"),
            Err(err) => println!("日志文件创建失败: {:?}", err),
        }
    }
    
  5. 日志级别设置 根据指定的日志级别记录信息。

    fn set_logs(level: String, message: String) {
        match level.as_str() {
            "info" => log::info!("{}", message),
            "error" => log::error!("{}", message),
            "warn" => log::warn!("{}", message),
            "debug" => log::debug!("{}", message),
            _ => log::trace!("{}", message),
        }
    }
    
    fn main() {
        init_logging();
        set_logs("info".to_string(), "这是第一条日志".to_string());
    }
    
效果展示

image.png