use tracing_subscriber::fmt::format::FmtSpan;
use tracing_subscriber::EnvFilter;
use tracing_appender::rolling::{RollingFileAppender, Rotation};
pub fn init(config: &alun_config::LogConfig) {
let level = &config.level;
let filter = EnvFilter::try_from_default_env()
.unwrap_or_else(|_| build_default_filter(level));
let format = config.format.as_str();
if format == "json" {
let subscriber = tracing_subscriber::fmt()
.with_env_filter(filter)
.with_span_events(FmtSpan::CLOSE)
.json();
if let Some(dir) = &config.dir {
let file_appender = RollingFileAppender::new(Rotation::DAILY, dir, &config.file_prefix);
let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
let _ = subscriber.with_writer(non_blocking).try_init();
} else {
let _ = subscriber.try_init();
}
} else {
let subscriber = tracing_subscriber::fmt()
.with_env_filter(filter)
.with_span_events(FmtSpan::CLOSE);
if let Some(dir) = &config.dir {
let file_appender = RollingFileAppender::new(Rotation::DAILY, dir, &config.file_prefix);
let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
let _ = subscriber.with_writer(non_blocking).try_init();
} else {
let _ = subscriber.try_init();
}
}
}
fn build_default_filter(level: &str) -> EnvFilter {
let filter_str = format!(
"debug,\
alun={level},alun_web={level},alun_core={level},alun_db={level},\
alun_config={level},alun_log={level},alun_macros={level},alun_utils={level},\
alun_plugin={level},alun_cache={level},alun_task={level},alun_kafka={level},\
alun_fs={level},alun_template={level},\
tower_http=warn,hyper=warn,sqlx=warn,reqwest=warn,rustls=warn,\
tokio_tungstenite=warn,tungstenite=warn,mio=warn,h2=warn",
level = level
);
EnvFilter::new(&filter_str)
}