use std::borrow::Cow;
use tracing_subscriber::filter::ParseError;
use tracing_subscriber::EnvFilter;
const DEFAULT_RUST_LOG: &str = "tokio_reactor=info,\
config=info,\
unc=info,\
recompress=info,\
stats=info,\
telemetry=info,\
db=info,\
delay_detector=info,\
unc-performance-metrics=info,\
state_viewer=info,\
warn";
#[non_exhaustive]
#[derive(thiserror::Error, Debug)]
pub enum BuildEnvFilterError {
#[error("could not create a log filter for {1}")]
CreateEnvFilter(#[source] ParseError, String),
}
#[derive(Debug)]
pub struct EnvFilterBuilder<'a> {
rust_log: Cow<'a, str>,
verbose: Option<&'a str>,
}
impl<'a> EnvFilterBuilder<'a> {
pub fn from_env() -> Self {
Self::new(
std::env::var("RUST_LOG").map(Cow::Owned).unwrap_or(Cow::Borrowed(DEFAULT_RUST_LOG)),
)
}
pub fn new<S: Into<Cow<'a, str>>>(rust_log: S) -> Self {
Self { rust_log: rust_log.into(), verbose: None }
}
pub fn verbose(mut self, target: Option<&'a str>) -> Self {
self.verbose = target;
self
}
pub fn finish(self) -> Result<EnvFilter, BuildEnvFilterError> {
let mut env_filter = EnvFilter::try_new(self.rust_log.clone())
.map_err(|err| BuildEnvFilterError::CreateEnvFilter(err, self.rust_log.to_string()))?;
if let Some(module) = self.verbose {
env_filter = env_filter
.add_directive("cranelift_codegen=warn".parse().expect("parse directive"))
.add_directive("h2=warn".parse().expect("parse directive"))
.add_directive("tower=warn".parse().expect("parse directive"))
.add_directive("trust_dns_resolver=warn".parse().expect("parse directive"))
.add_directive("trust_dns_proto=warn".parse().expect("parse directive"));
env_filter = if module.is_empty() {
env_filter.add_directive(tracing::Level::DEBUG.into())
} else {
let directive = format!("{}=debug", module).parse().map_err(|err| {
BuildEnvFilterError::CreateEnvFilter(err, format!("{}=debug", module))
})?;
env_filter.add_directive(directive)
};
}
Ok(env_filter)
}
}
pub fn make_env_filter(verbose: Option<&str>) -> Result<EnvFilter, BuildEnvFilterError> {
let env_filter = EnvFilterBuilder::from_env().verbose(verbose).finish()?;
let env_filter = if cfg!(feature = "sandbox") {
env_filter.add_directive("sandbox=debug".parse().unwrap())
} else {
env_filter
};
Ok(env_filter)
}