diff --git a/src/kira_logger.rs b/src/kira_logger.rs new file mode 100644 index 0000000..0e4abea --- /dev/null +++ b/src/kira_logger.rs @@ -0,0 +1,63 @@ +use log::{Level, Metadata, Record, SetLoggerError, LevelFilter}; +use std::fs::{File, OpenOptions}; +use std::io::Write; +use std::sync::Mutex; +use std::sync::LazyLock; +use time_format; + +struct KiraLogger { + file: Option>, +} + +impl KiraLogger { + pub fn open(file_name: Option<&str>) -> std::io::Result { + match file_name { + Some(f_n) => Ok(Self { + file: Some(Mutex::new( + OpenOptions::new().append(true).create(true).open(f_n)?, + )), + }), + None => Ok(Self { + file: None, + }), + } + } +} + +impl log::Log for KiraLogger { + fn enabled(&self, metadata: &Metadata) -> bool { + (metadata.target().starts_with("kira_installer") && metadata.level() <= Level::Debug) || (metadata.level() <= Level::Error) + } + + fn log(&self, record: &Record) { + if self.enabled(record.metadata()) { + let ts = time_format::now().unwrap(); + let local_time = time_format::strftime_local("%Y-%m-%dT%H:%M:%S", ts).unwrap(); + if let Some(m_file) = &self.file { + + let mut write_lock = m_file.lock().unwrap(); + let _ = writeln!(&mut *write_lock, "{} {}: {}", local_time, record.level(), record.args()); + } + println!("{} {} {}: {}", local_time,record.metadata().target(), record.level(), record.args()); + } + } + + fn flush(&self) { + if let Some(m_file) = &self.file { + let mut write_lock = m_file.lock().unwrap(); + let _ = (&mut *write_lock).flush(); + } + } +} + +static LOGGER: LazyLock = LazyLock::new(|| { + let ts = time_format::now().unwrap(); + // Local time with timezone name + let local_time = time_format::strftime_local("%Y-%m-%d_%H-%M-%S", ts).unwrap(); + KiraLogger::open(Some(format!("installation_{}.log", local_time).as_str())).unwrap() +}); + +pub fn init() -> Result<(), SetLoggerError> { + log::set_logger(&*LOGGER) + .map(|()| log::set_max_level(LevelFilter::Debug)) +} \ No newline at end of file