Skip to main content

rs_zero/core/
logging.rs

1use tracing_subscriber::{EnvFilter, fmt};
2
3use crate::core::{CoreError, CoreResult};
4
5/// Logging configuration for rs-zero services.
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct LogConfig {
8    /// Env filter directive, for example `info,tower_http=debug`.
9    pub filter: String,
10    /// Whether ANSI colors should be emitted.
11    pub ansi: bool,
12}
13
14impl Default for LogConfig {
15    fn default() -> Self {
16        Self {
17            filter: "info".to_string(),
18            ansi: true,
19        }
20    }
21}
22
23/// Initializes a global tracing subscriber.
24///
25/// Calling this more than once returns `CoreError::SubscriberInit`; tests can
26/// use `try_init` semantics by ignoring that specific error.
27pub fn init_tracing(config: LogConfig) -> CoreResult<()> {
28    let filter = EnvFilter::try_new(config.filter).unwrap_or_else(|_| EnvFilter::new("info"));
29    fmt()
30        .with_env_filter(filter)
31        .with_ansi(config.ansi)
32        .try_init()
33        .map_err(|_| CoreError::SubscriberInit)
34}
35
36#[cfg(test)]
37mod tests {
38    use super::{LogConfig, init_tracing};
39
40    #[test]
41    fn init_tracing_is_callable() {
42        let _ = init_tracing(LogConfig {
43            filter: "debug".to_string(),
44            ansi: false,
45        });
46    }
47}