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}