use tracing_appender::{ non_blocking::WorkerGuard, rolling::{RollingFileAppender, Rotation}, }; use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt}; use tracing_tree::HierarchicalLayer; use crate::config::AppEnv; pub struct LoggerConfig { _guard: Option, } impl LoggerConfig { pub fn init(app_env: AppEnv) -> Self { match app_env { AppEnv::Development => { Self::init_dev(); Self { _guard: None } } AppEnv::Production => { let guard = Self::init_prod(); Self { _guard: Some(guard), } } } } fn init_dev() { let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("debug")); let layer = HierarchicalLayer::new(1).with_ansi(true).with_targets(true); tracing_subscriber::registry() .with(env_filter) .with(layer) .init(); } fn init_prod() -> WorkerGuard { let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); let file_appender = RollingFileAppender::new(Rotation::DAILY, "./logs", "app.log"); let (non_blocking, guard) = tracing_appender::non_blocking(file_appender); let file_layer = HierarchicalLayer::new(1) .with_writer(non_blocking) .with_ansi(false) .with_targets(true) .with_thread_names(true); let console_layer = HierarchicalLayer::new(2).with_ansi(true).with_targets(true); tracing_subscriber::registry() .with(env_filter) .with(file_layer) .with(console_layer) .init(); guard } }