use std::{
collections::BTreeMap,
fs::{File, OpenOptions},
io::{self, Write}, path::PathBuf,
};
use crate::wit::balius::app::logging as wit;
use super::{level_to_string, LoggerProvider};
pub struct FileLogger {
files: BTreeMap<String, File>,
folder: PathBuf,
}
impl FileLogger {
pub fn try_new(folder: Option<PathBuf>) -> io::Result<Self> {
let folder = folder.unwrap_or(std::env::current_dir()?);
std::fs::create_dir_all(&folder)?;
Ok(FileLogger {
files: BTreeMap::new(),
folder,
})
}
}
#[async_trait::async_trait]
impl LoggerProvider for FileLogger {
async fn log(&mut self, worker_id: &str, level: wit::Level, context: String, message: String) {
let mut file = match self.files.get(worker_id) {
Some(file) => file,
None => {
let Ok(file) = OpenOptions::new()
.create(true)
.append(true)
.open(self.folder.join(format!("{worker_id}.log")))
else {
return;
};
self.files.entry(worker_id.to_string()).or_insert(file)
}
};
let _ = file.write(
format!(
"{}: {} - {} - {}\n",
chrono::Utc::now().to_rfc3339(),
level_to_string(&level),
context,
message
)
.as_bytes(),
);
}
}