diff options
Diffstat (limited to 'src/logging.rs')
-rw-r--r-- | src/logging.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/logging.rs b/src/logging.rs new file mode 100644 index 0000000..c97948f --- /dev/null +++ b/src/logging.rs @@ -0,0 +1,36 @@ +use crate::Result; +use figment::Provider; +use std::{fs::File, sync::Arc}; +use tracing::metadata::LevelFilter; +use tracing_subscriber::{prelude::*, Layer}; + +pub use config::Config; +pub use level::Level; + +mod config; +mod level; + +pub fn init_from_provider<T: Provider>(provider: T) -> Result<()> { + let config = Config::extract(&provider)?; + + let stdout_layer = tracing_subscriber::fmt::layer() + .pretty() + .with_filter(LevelFilter::from(config.level)); + + let log_layer = if config.level.is_some() { + let file = File::create(&config.path)?; + tracing_subscriber::fmt::layer() + .with_writer(Arc::new(file)) + .with_filter(LevelFilter::from(config.level)) + .into() + } else { + None + }; + + tracing_subscriber::registry() + .with(stdout_layer) + .with(log_layer) + .init(); + + Ok(()) +} |