Skip to main content

siderite_config/
tracing_init.rs

1//! Tracing subscriber installation from [`crate::LogSettings`].
2
3use crate::error::ConfigError;
4use crate::settings::LogSettings;
5use tracing_subscriber::EnvFilter;
6
7/// Install a `tracing-subscriber` using `log`.
8///
9/// When `RUST_LOG` is set, it is used as the filter. Otherwise `log.level` is
10/// used. `log.json` selects JSON versus the default text formatter.
11///
12/// # Errors
13/// Returns [`ConfigError::InvalidFilter`] if the chosen filter cannot be
14/// parsed, or [`ConfigError::Tracing`] if a global subscriber is already
15/// installed.
16pub fn init_tracing(log: &LogSettings) -> Result<(), ConfigError> {
17    let filter = env_filter(log)?;
18    if log.json {
19        tracing_subscriber::fmt()
20            .json()
21            .with_env_filter(filter)
22            .try_init()
23            .map_err(|err| ConfigError::Tracing(err.to_string()))
24    } else {
25        tracing_subscriber::fmt()
26            .with_env_filter(filter)
27            .try_init()
28            .map_err(|err| ConfigError::Tracing(err.to_string()))
29    }
30}
31
32pub(crate) fn env_filter(log: &LogSettings) -> Result<EnvFilter, ConfigError> {
33    if std::env::var_os("RUST_LOG").is_some() {
34        EnvFilter::try_from_default_env().map_err(|err| ConfigError::InvalidFilter(err.to_string()))
35    } else {
36        EnvFilter::try_new(log.level.as_str())
37            .map_err(|err| ConfigError::InvalidFilter(err.to_string()))
38    }
39}