ros2_helpers/
logger.rs

1//! Implement logger for ros2 logging
2//!
3use log::*;
4use safe_drive::logger::Logger as SdLogger;
5use safe_drive::{pr_debug, pr_error, pr_info, pr_warn};
6use std::sync::Arc;
7
8use log::{Level, Metadata, Record};
9
10struct Logger(Arc<SdLogger>);
11
12impl Logger {
13    /// [Logger] constructor
14    fn new(name: &str) -> Self {
15        Self(Arc::new(SdLogger::new(name)))
16    }
17
18    /// init
19    fn init(self) -> Result<(), SetLoggerError> {
20        set_max_level(LevelFilter::Trace);
21        set_boxed_logger(Box::new(self))?;
22        Ok(())
23    }
24}
25
26impl Log for Logger {
27    fn enabled(&self, metadata: &Metadata) -> bool {
28        metadata.level() <= Level::Trace
29    }
30    fn log(&self, record: &Record) {
31        if self.enabled(record.metadata()) {
32            match record.level() {
33                Level::Trace => pr_debug!(self.0, "{}", record.args()),
34                Level::Debug => pr_debug!(self.0, "{}", record.args()),
35                Level::Info => pr_info!(self.0, "{}", record.args()),
36                Level::Warn => pr_warn!(self.0, "{}", record.args()),
37                Level::Error => pr_error!(self.0, "{}", record.args()),
38            }
39        }
40    }
41    fn flush(&self) {}
42}
43
44/// Initialize the logger with the node name
45pub fn init_logger(name: &str) -> Result<(), SetLoggerError> {
46    Logger::new(name).init()
47}