1#![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}