git_iris/
logger.rs

1use chrono::Local;
2use log::{Level, LevelFilter, Metadata, Record};
3use once_cell::sync::Lazy;
4use parking_lot::Mutex;
5use std::fs::OpenOptions;
6use std::io::Write;
7
8struct GitIrisLogger;
9
10static LOGGER: GitIrisLogger = GitIrisLogger;
11static LOGGING_ENABLED: Lazy<Mutex<bool>> = Lazy::new(|| Mutex::new(false));
12static LOG_FILE: Lazy<Mutex<Option<std::fs::File>>> = Lazy::new(|| Mutex::new(None));
13static LOG_TO_STDOUT: Lazy<Mutex<bool>> = Lazy::new(|| Mutex::new(false));
14
15impl log::Log for GitIrisLogger {
16    fn enabled(&self, metadata: &Metadata) -> bool {
17        *LOGGING_ENABLED.lock() && metadata.level() <= Level::Debug
18    }
19
20    fn log(&self, record: &Record) {
21        if self.enabled(record.metadata()) {
22            let timestamp = Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
23            let message = format!("{} {} - {}\n", timestamp, record.level(), record.args());
24
25            if let Some(file) = LOG_FILE.lock().as_mut() {
26                let _ = file.write_all(message.as_bytes());
27                let _ = file.flush();
28            }
29
30            if *LOG_TO_STDOUT.lock() {
31                print!("{message}");
32            }
33        }
34    }
35
36    fn flush(&self) {}
37}
38
39pub fn init() -> Result<(), log::SetLoggerError> {
40    log::set_logger(&LOGGER).map(|()| log::set_max_level(LevelFilter::Debug))
41}
42
43pub fn enable_logging() {
44    let mut logging_enabled = LOGGING_ENABLED.lock();
45    *logging_enabled = true;
46}
47
48pub fn disable_logging() {
49    let mut logging_enabled = LOGGING_ENABLED.lock();
50    *logging_enabled = false;
51}
52
53pub fn set_log_file(file_path: &str) -> std::io::Result<()> {
54    let file = OpenOptions::new()
55        .create(true)
56        .append(true)
57        .open(file_path)?;
58
59    let mut log_file = LOG_FILE.lock();
60    *log_file = Some(file);
61    Ok(())
62}
63
64pub fn set_log_to_stdout(enabled: bool) {
65    let mut log_to_stdout = LOG_TO_STDOUT.lock();
66    *log_to_stdout = enabled;
67}
68
69#[macro_export]
70macro_rules! log_debug {
71    ($($arg:tt)*) => {
72        log::debug!($($arg)*)
73    };
74}
75
76#[macro_export]
77macro_rules! log_error {
78    ($($arg:tt)*) => {
79        log::error!($($arg)*)
80    };
81}