Skip to main content

tracing_pbar/
lines.rs

1//! Logging lines to a file/stdout/stderr.
2
3use bon::builder;
4use bon::Builder;
5use strum::EnumString;
6use tracing_glog::Glog;
7use tracing_glog::GlogFields;
8use tracing_glog::LocalTime;
9use tracing_subscriber::fmt::writer::BoxMakeWriter;
10use tracing_subscriber::EnvFilter;
11use tracing_subscriber::Layer;
12
13use super::BoxLayer;
14
15#[derive(Debug, Clone, Copy, EnumString)]
16#[strum(ascii_case_insensitive)]
17pub enum LinesFormat {
18    Glog,
19    Json,
20    Full,
21    Simple,
22}
23
24#[derive(Debug, Builder)]
25pub struct LinesConfig {
26    writer: BoxMakeWriter,
27    filter: EnvFilter,
28    #[builder(default = LinesFormat::Glog)]
29    format: LinesFormat,
30}
31
32impl LinesConfig {
33    pub fn layer(self) -> BoxLayer {
34        match self.format {
35            LinesFormat::Glog => self.glog_layer(),
36            LinesFormat::Json => self.json_layer(),
37            LinesFormat::Full => self.full_layer(),
38            LinesFormat::Simple => self.simple_layer(),
39        }
40    }
41
42    // TODO: This now relies on the caller handling ASNI properly
43    fn glog_layer(self) -> BoxLayer {
44        tracing_subscriber::fmt::layer()
45            .event_format(Glog::default().with_timer(LocalTime::default()))
46            .fmt_fields(GlogFields::default())
47            .with_writer(self.writer)
48            .with_filter(self.filter)
49            .boxed()
50    }
51
52    fn json_layer(self) -> BoxLayer {
53        tracing_subscriber::fmt::layer()
54            .json()
55            .with_writer(self.writer)
56            .with_filter(self.filter)
57            .boxed()
58    }
59
60    fn full_layer(self) -> BoxLayer {
61        tracing_subscriber::fmt::layer()
62            .with_writer(self.writer)
63            .with_filter(self.filter)
64            .boxed()
65    }
66
67    fn simple_layer(self) -> BoxLayer {
68        tracing_subscriber::fmt::layer()
69            .compact()
70            .with_level(false)
71            .with_target(false)
72            .without_time()
73            .with_writer(self.writer)
74            .with_filter(self.filter)
75            .boxed()
76    }
77}