use tracing::{Level, level_filters::LevelFilter};
use tracing_subscriber::{
EnvFilter, filter::filter_fn, fmt, layer::SubscriberExt, util::SubscriberInitExt,
};
pub fn init(verbosity: Option<LevelFilter>) {
let env_filter = EnvFilter::try_from_env("RELEASE_PLZ_LOG").unwrap_or_else(|_| {
EnvFilter::builder()
.with_default_directive(verbosity.unwrap_or(LevelFilter::INFO).into())
.from_env_lossy()
});
let verbose = verbosity.is_some();
let ignore_info_spans = filter_fn(move |metadata| {
let is_trace_or_debug = || metadata.level() < &Level::INFO;
verbose || !metadata.is_span() || is_trace_or_debug()
});
let ansi =
std::env::var_os("RELEASE_PLZ_NO_ANSI").is_none() && std::env::var_os("NO_COLOR").is_none();
fmt()
.with_env_filter(env_filter)
.with_writer(std::io::stderr)
.with_ansi(ansi)
.with_target(verbose)
.with_file(verbose)
.with_line_number(verbose)
.finish()
.with(ignore_info_spans)
.init();
}