mm1_logger/
lib.rs

1// #![warn(missing_docs)]
2#![warn(rust_2018_idioms)]
3#![warn(unreachable_pub)]
4
5mod config;
6pub use config::{Level, LogTargetConfig, LoggingConfig};
7
8pub type AnyError = Box<dyn std::error::Error + Send + Sync + 'static>;
9
10mod level_filter_trie;
11
12pub fn init(config: &LoggingConfig) -> Result<(), AnyError> {
13    use tracing_subscriber::prelude::*;
14    use tracing_subscriber::util::SubscriberInitExt;
15    use tracing_subscriber::{Layer, filter};
16
17    let filter = level_filter_trie::FilterTrie::from_statements(&config.log_target_filter);
18
19    let fmt = tracing_subscriber::fmt::layer()
20        .pretty()
21        .with_target(true)
22        .with_thread_names(false)
23        .with_file(true)
24        .with_filter(filter::LevelFilter::from_level(config.min_log_level))
25        .with_filter(filter::filter_fn(move |entry| {
26            filter
27                .level_for_target(entry.target().split("::"))
28                .map(|level| level >= *entry.level())
29                .unwrap_or(false)
30        }));
31
32    tracing_subscriber::registry().with(fmt).try_init()?;
33    Ok(())
34}