Skip to main content

nanolog/
lib.rs

1//! # nanolog
2//!
3//! A minimal log library only depending on[`log`](https://crates.io/crates/log)
4//! and `std`.
5
6use std::time::SystemTime;
7
8use log::{LevelFilter, Log};
9
10/// Internal representation of the logger.
11struct Logger {
12    level_filter: LevelFilter,
13}
14
15/// Initializes the logger with a given [`LevelFilter`].
16///
17/// Panics in the case that this function has already been called before.
18pub fn init(level_filter: LevelFilter) {
19    log::set_max_level(level_filter);
20    log::set_boxed_logger(Box::new(Logger { level_filter })).unwrap();
21}
22
23impl Log for Logger {
24    fn enabled(&self, metadata: &log::Metadata) -> bool {
25        metadata.level() <= self.level_filter
26    }
27
28    fn log(&self, record: &log::Record) {
29        let timestamp = SystemTime::UNIX_EPOCH.elapsed().unwrap().as_secs();
30        let level = record.level().as_str();
31        let target = record.target();
32        let args = record.args();
33        eprintln!("[{timestamp} {level} {target}] {args}");
34    }
35
36    fn flush(&self) {}
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn minimal() {
45        init(LevelFilter::Trace);
46        log::trace!("trace");
47        log::debug!("debug");
48        log::info!("info");
49        log::warn!("warn");
50        log::error!("error");
51    }
52}