moq_native/
log.rs

1use serde::{Deserialize, Serialize};
2use serde_with::DisplayFromStr;
3use tracing::level_filters::LevelFilter;
4use tracing::Level;
5use tracing_subscriber::EnvFilter;
6
7#[serde_with::serde_as]
8#[derive(Clone, clap::Parser, Serialize, Deserialize, Debug)]
9#[serde(deny_unknown_fields, default)]
10pub struct Log {
11	/// The level filter to use.
12	#[serde_as(as = "DisplayFromStr")]
13	#[arg(id = "log-level", long = "log-level", default_value = "info", env = "MOQ_LOG_LEVEL")]
14	pub level: Level,
15}
16
17impl Default for Log {
18	fn default() -> Self {
19		Self { level: Level::INFO }
20	}
21}
22
23impl Log {
24	pub fn level(&self) -> LevelFilter {
25		LevelFilter::from_level(self.level)
26	}
27
28	pub fn init(&self) {
29		let filter = EnvFilter::builder()
30			.with_default_directive(self.level().into()) // Default to our -q/-v args
31			.from_env_lossy() // Allow overriding with RUST_LOG
32			.add_directive("h2=warn".parse().unwrap())
33			.add_directive("quinn=info".parse().unwrap())
34			.add_directive("tracing::span=off".parse().unwrap())
35			.add_directive("tracing::span::active=off".parse().unwrap());
36
37		let logger = tracing_subscriber::FmtSubscriber::builder()
38			.with_writer(std::io::stderr)
39			.with_env_filter(filter)
40			.finish();
41
42		tracing::subscriber::set_global_default(logger).unwrap();
43	}
44}