Skip to main content

bindizr_core/logger/
mod.rs

1use std::io::{self, Write};
2
3use log::{Level, Metadata, Record};
4
5use crate::config;
6
7#[macro_export]
8macro_rules! log_error {
9    ($($arg:tt)*) => {
10        log::error!($($arg)*)
11    };
12}
13
14#[macro_export]
15macro_rules! log_warn {
16    ($($arg:tt)*) => {
17        log::warn!($($arg)*)
18    };
19}
20
21#[macro_export]
22macro_rules! log_info {
23    ($($arg:tt)*) => {
24        log::info!($($arg)*)
25    };
26}
27
28#[macro_export]
29macro_rules! log_debug {
30    ($($arg:tt)*) => {
31        log::debug!($($arg)*)
32    };
33}
34
35#[macro_export]
36macro_rules! log_trace {
37    ($($arg:tt)*) => {
38        log::trace!($($arg)*)
39    };
40}
41
42pub struct Logger {
43    log_level: Level,
44}
45
46impl log::Log for Logger {
47    fn enabled(&self, metadata: &Metadata) -> bool {
48        metadata.level() <= self.log_level
49    }
50
51    fn log(&self, record: &Record) {
52        if self.enabled(record.metadata()) {
53            let log_message = if self.log_level == Level::Debug {
54                // Include target in debug logs
55                format!(
56                    "{} - {}: {}\n",
57                    record.level(),
58                    record.target(),
59                    record.args()
60                )
61            } else {
62                // Exclude target for other log levels
63                format!("{}: {}\n", record.level(), record.args())
64            };
65
66            // Use stderr for logging to avoid interfering with stdout
67            eprint!("{}", log_message);
68        }
69    }
70
71    fn flush(&self) {
72        let _ = io::stderr().flush();
73    }
74}
75
76pub fn initialize() {
77    let log_level = match config::get_bindizr_config().logging.log_level {
78        config::LogLevel::Error => Level::Error,
79        config::LogLevel::Warn => Level::Warn,
80        config::LogLevel::Debug => Level::Debug,
81        config::LogLevel::Trace => Level::Trace,
82        config::LogLevel::Info => Level::Info,
83    };
84
85    let logger = Logger { log_level };
86
87    if let Err(e) = log::set_boxed_logger(Box::new(logger)) {
88        eprintln!("Failed to set logger: {}", e);
89        return;
90    }
91    log::set_max_level(log_level.to_level_filter());
92
93    println!("Console logging level: {}", log_level);
94}