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 #[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()) .from_env_lossy() .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}