baichun-framework-logger 0.1.0

Logger module for Baichun-Rust framework
Documentation
use std::{
    fs::{self, File},
    io::{BufWriter, Write},
    path::PathBuf,
    sync::Arc,
};

use parking_lot::Mutex;

use crate::{config::LogLevel, error::Result};

use super::LogAppender;

/// 文件追加器
#[derive(Debug)]
pub struct FileAppender {
    /// 文件路径
    path: PathBuf,
    /// 写入器
    writer: Arc<Mutex<BufWriter<File>>>,
}

impl FileAppender {
    /// 创建文件追加器
    pub fn new(path: PathBuf) -> Result<Self> {
        // 创建目录
        if let Some(parent) = path.parent() {
            fs::create_dir_all(parent)?;
        }

        // 打开文件
        let file = std::fs::OpenOptions::new()
            .create(true)
            .append(true)
            .open(&path)?;

        Ok(Self {
            path,
            writer: Arc::new(Mutex::new(BufWriter::new(file))),
        })
    }

    /// 获取文件路径
    pub fn path(&self) -> &PathBuf {
        &self.path
    }
}

impl LogAppender for FileAppender {
    fn write(&self, _level: LogLevel, message: &str) -> Result<()> {
        let mut writer = self.writer.lock();
        writer.write_all(message.as_bytes())?;
        writer.write_all(b"\n")?;
        Ok(())
    }

    fn flush(&self) -> Result<()> {
        let mut writer = self.writer.lock();
        writer.flush()?;
        Ok(())
    }
}

impl Clone for FileAppender {
    fn clone(&self) -> Self {
        Self {
            path: self.path.clone(),
            writer: Arc::clone(&self.writer),
        }
    }
}