rtt_logger/
lib.rs

1//! A logger implementation to use RTT with the Rust `log` crate.
2//!
3//! ```
4//! use log::{info, LevelFilter};
5//! use rtt_logger::RTTLogger;
6//! use rtt_target::rtt_init_print;
7//!
8//! // logger configuration
9//! const LOG_LEVEL: LevelFilter = LevelFilter::Info;
10//! static LOGGER: RTTLogger = RTTLogger::new(LOG_LEVEL);
11//!
12//! fn main() {
13//!     // logger setup
14//!     rtt_init_print!();
15//!     log::set_logger(&LOGGER)
16//!         .map(|()| log::set_max_level(LOG_LEVEL))
17//!         .unwrap();
18//!
19//!     // logger usage in main binary or in any library
20//!     info!("Hello World!");
21//! }
22//! ```
23
24#![no_std]
25
26use log::{LevelFilter, Metadata, Record};
27
28use rtt_target::*;
29
30/// An RTT-based logger implementation.
31pub struct RTTLogger {
32    level_filter: LevelFilter,
33}
34
35impl RTTLogger {
36    /// Static-friendly const initializer.
37    ///
38    /// * `level_filter`: The default level to enable.
39    pub const fn new(level_filter: LevelFilter) -> RTTLogger {
40        RTTLogger { level_filter }
41    }
42}
43
44impl log::Log for RTTLogger {
45    fn enabled(&self, metadata: &Metadata) -> bool {
46        self.level_filter.ge(&metadata.level())
47    }
48
49    fn log(&self, record: &Record) {
50        if self.enabled(record.metadata()) {
51            rprintln!("{} - {}", record.level(), record.args());
52        }
53    }
54
55    fn flush(&self) {}
56}