logging.rs (2360B)
1 use std::path::PathBuf; 2 3 use tracing::Level; 4 5 #[derive(Clone, Debug, Default, serde::Deserialize)] 6 pub struct LoggingConfig { 7 #[serde(default)] 8 pub file: Option<FileConfig>, 9 } 10 11 #[derive(Clone, Debug, serde::Deserialize)] 12 pub struct FileConfig { 13 pub directory: PathBuf, 14 pub prefix: String, 15 #[serde(flatten)] 16 pub subscriber: SubscriberConfig, 17 } 18 19 #[derive(Clone, Debug, serde::Deserialize)] 20 pub struct SubscriberConfig { 21 #[serde(default)] 22 pub format: LogFormat, 23 #[serde(default)] 24 pub level: LogLevel, 25 #[serde(default)] 26 pub target_filters: Vec<TargetFilter>, 27 #[serde(default = "SubscriberConfig::default_ansi")] 28 pub ansi: bool, 29 #[serde(default = "SubscriberConfig::default_target")] 30 pub target: bool, 31 #[serde(default = "SubscriberConfig::default_file_path")] 32 pub file_path: bool, 33 #[serde(default = "SubscriberConfig::default_line_number")] 34 pub line_number: bool, 35 } 36 37 impl SubscriberConfig { 38 pub fn default_ansi() -> bool { 39 false 40 } 41 42 pub fn default_target() -> bool { 43 true 44 } 45 46 pub fn default_file_path() -> bool { 47 false 48 } 49 50 pub fn default_line_number() -> bool { 51 false 52 } 53 } 54 55 #[derive(Clone, Debug, serde::Deserialize)] 56 #[serde(rename_all = "snake_case")] 57 pub struct TargetFilter { 58 #[serde(default)] 59 #[serde(rename = "type")] 60 pub filter_type: TargetFilterType, 61 pub pattern: String, 62 } 63 64 #[derive(Clone, Debug, Copy, Default, serde::Deserialize)] 65 #[serde(rename_all = "snake_case")] 66 pub enum TargetFilterType { 67 #[default] 68 Whitelist, 69 Blacklist, 70 } 71 72 #[derive(Clone, Debug, Copy, Default, serde::Deserialize)] 73 #[serde(rename_all = "snake_case")] 74 pub enum LogFormat { 75 #[default] 76 Plain, 77 Json, 78 } 79 80 #[derive(Clone, Debug, Copy, Default, serde::Deserialize)] 81 #[serde(rename_all = "snake_case")] 82 pub enum LogLevel { 83 #[default] 84 Off, 85 Error, 86 Warn, 87 Info, 88 Debug, 89 Trace, 90 } 91 92 impl From<LogLevel> for Option<Level> { 93 fn from(value: LogLevel) -> Self { 94 match value { 95 LogLevel::Off => None, 96 LogLevel::Error => Some(Level::ERROR), 97 LogLevel::Warn => Some(Level::WARN), 98 LogLevel::Info => Some(Level::INFO), 99 LogLevel::Debug => Some(Level::DEBUG), 100 LogLevel::Trace => Some(Level::TRACE), 101 } 102 } 103 }