Skip to main content

elfo_core/logging/
config.rs

1//! [Config].
2//!
3//! [Config]: LoggingConfig
4
5use serde::{Deserialize, Deserializer};
6use tracing::level_filters::LevelFilter;
7
8/// Logging configuration.
9///
10/// # Example
11/// ```toml
12/// [some_group]
13/// system.logging.max_level = "Warn"
14/// system.logging.max_rate_per_level = 1_000
15/// ```
16#[derive(Debug, Deserialize)]
17#[serde(default)]
18pub struct LoggingConfig {
19    /// Maximum level of logging.
20    ///
21    /// `Info` by default.
22    #[serde(deserialize_with = "deserialize_level_filter")]
23    pub max_level: LevelFilter,
24    /// Maximum rate of logging per level.
25    ///
26    /// `1_000` by default.
27    pub max_rate_per_level: u64,
28}
29
30impl Default for LoggingConfig {
31    fn default() -> Self {
32        Self {
33            max_level: LevelFilter::INFO,
34            max_rate_per_level: 1000,
35        }
36    }
37}
38
39fn deserialize_level_filter<'de, D>(deserializer: D) -> Result<LevelFilter, D::Error>
40where
41    D: Deserializer<'de>,
42{
43    use PrettyLevelFilter::*;
44
45    #[derive(Deserialize)]
46    pub(crate) enum PrettyLevelFilter {
47        Trace,
48        Debug,
49        Info,
50        Warn,
51        Error,
52        Off,
53    }
54
55    let pretty = PrettyLevelFilter::deserialize(deserializer)?;
56
57    Ok(match pretty {
58        Trace => LevelFilter::TRACE,
59        Debug => LevelFilter::DEBUG,
60        Info => LevelFilter::INFO,
61        Warn => LevelFilter::WARN,
62        Error => LevelFilter::ERROR,
63        Off => LevelFilter::OFF,
64    })
65}