1use crate::logging::structured::{LogFormat, LoggerConfig};
8use serde::{Deserialize, Serialize};
9use std::collections::HashMap;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct LoggingConfig {
14 #[serde(default = "default_false")]
16 pub structured: bool,
17
18 #[serde(default = "default_format")]
20 pub format: String,
21
22 #[serde(default = "default_level")]
24 pub level: String,
25
26 #[serde(default = "default_true")]
28 pub include_location: bool,
29
30 #[serde(default = "default_true")]
32 pub include_thread_id: bool,
33
34 #[serde(default = "default_true")]
36 pub include_trace_id: bool,
37
38 #[serde(default = "default_true")]
40 pub propagate_trace_id: bool,
41
42 #[serde(default = "default_trace_header")]
44 pub trace_id_header: String,
45
46 #[serde(default)]
48 pub static_fields: HashMap<String, String>,
49}
50
51const fn default_false() -> bool {
52 false
53}
54
55const fn default_true() -> bool {
56 true
57}
58
59fn default_format() -> String {
60 "terminal".to_string()
61}
62
63fn default_level() -> String {
64 "info".to_string()
65}
66
67fn default_trace_header() -> String {
68 "X-Trace-ID".to_string()
69}
70
71impl Default for LoggingConfig {
72 fn default() -> Self {
73 Self {
74 structured: false,
75 format: default_format(),
76 level: default_level(),
77 include_location: true,
78 include_thread_id: true,
79 include_trace_id: true,
80 propagate_trace_id: true,
81 trace_id_header: default_trace_header(),
82 static_fields: HashMap::new(),
83 }
84 }
85}
86
87impl LoggingConfig {
88 #[must_use]
90 pub fn to_logger_config(&self) -> LoggerConfig {
91 LoggerConfig {
92 format: match self.format.to_lowercase().as_str() {
93 "json" => LogFormat::Json,
94 _ => LogFormat::Terminal,
95 },
96 level: match self.level.to_lowercase().as_str() {
97 "trace" => slog::Level::Trace,
98 "debug" => slog::Level::Debug,
99 "warn" => slog::Level::Warning,
100 "error" => slog::Level::Error,
101 "critical" => slog::Level::Critical,
102 _ => slog::Level::Info, },
104 include_location: self.include_location,
105 include_thread_id: self.include_thread_id,
106 static_fields: self.static_fields.clone(),
107 }
108 }
109}