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}