eigen_logging/
tracing_logger.rs

1use super::log_level::LogLevel;
2use super::logger::Logger;
3use std::{fmt::Debug, sync::Arc};
4use tracing::{debug, error, info, trace, warn};
5
6// SLoggerOptions are options when creating a new SLogger.
7// A zero Options consists entirely of default values.
8//
9// SLoggerOptions are an extension of [slog.HandlerOptions].
10#[derive(Default, Debug, Clone)]
11pub struct TracingLogger {
12    // Enable source code location (Default: false)
13    pub add_source: bool,
14
15    // Minimum level to log (Default: slog.LevelInfo)
16    pub level: LogLevel,
17
18    // Time format (Default: time.StampMilli)
19    // only supported with text handler
20    pub time_format: String,
21}
22
23impl TracingLogger {
24    pub fn new_text_logger(
25        no_color: bool,
26        time_format: String,
27        level: LogLevel,
28        add_source: bool,
29    ) -> Arc<dyn Logger> {
30        let tracing_level = match level {
31            LogLevel::Fatal => tracing::Level::ERROR,
32            LogLevel::Error => tracing::Level::ERROR,
33            LogLevel::Warn => tracing::Level::WARN,
34            LogLevel::Info => tracing::Level::INFO,
35            LogLevel::Debug => tracing::Level::DEBUG,
36            LogLevel::Trace => tracing::Level::TRACE,
37        };
38        tracing::subscriber::set_global_default(
39            tracing_subscriber::fmt::Subscriber::builder()
40                .with_max_level(tracing_level)
41                .with_ansi(no_color)
42                .finish(),
43        )
44        .expect("setting default subscriber failed");
45
46        Arc::new(TracingLogger {
47            add_source,
48            level,
49            time_format,
50        })
51    }
52}
53
54pub fn create_tracing_logger(
55    no_color: bool,
56    time_format: String,
57    level: LogLevel,
58    add_source: bool,
59) -> Arc<dyn Logger> {
60    TracingLogger::new_text_logger(no_color, time_format, level, add_source)
61}
62
63impl Logger for TracingLogger {
64    // type LoggerType = TracingLogger;
65
66    fn debug(&self, msg: &str, tags: &str) {
67        debug!("{} {:?}", msg, [tags]);
68    }
69
70    fn info(&self, msg: &str, tags: &str) {
71        info!("{} {:?}", msg, [tags]);
72    }
73
74    fn warn(&self, msg: &str, tags: &str) {
75        warn!("{} {:?}", msg, [tags]);
76    }
77
78    fn error(&self, msg: &str, tags: &str) {
79        error!("{} {:?}", msg, [tags]);
80    }
81
82    fn fatal(&self, msg: &str, tags: &str) {
83        error!("{} {:?}", msg, [tags]);
84        panic!("Fatal error occurred: {} {:?}", msg, [tags]);
85    }
86
87    fn log(&self, msg: &str, tags: &str) {
88        match self.level {
89            LogLevel::Fatal => {
90                error!("Fatal");
91                self.fatal(msg, tags);
92            }
93            LogLevel::Error => {
94                error!("Error");
95                self.error(msg, tags);
96            }
97            LogLevel::Warn => {
98                warn!("Warn");
99                self.warn(msg, tags);
100            }
101            LogLevel::Info => {
102                info!("Info");
103                self.info(msg, tags);
104            }
105            LogLevel::Debug => {
106                debug!("Debug");
107                self.debug(msg, tags);
108            }
109            LogLevel::Trace => {
110                trace!("Trace");
111                self.debug(msg, tags);
112            }
113        }
114    }
115}
116
117#[cfg(test)]
118mod tests {
119    use crate::get_test_logger;
120
121    #[test]
122    fn test_log() {
123        let logger = get_test_logger();
124        logger.log("Log", "info logged");
125    }
126}