diff --git a/Cargo.lock b/Cargo.lock index 66d91f80..29beb49a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3214,6 +3214,16 @@ dependencies = [ "web-time", ] +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.18" @@ -3224,12 +3234,15 @@ dependencies = [ "nu-ansi-term", "once_cell", "regex", + "serde", + "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", + "tracing-serde", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4e71bdb4..d7682651 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -139,7 +139,7 @@ tower-http = { version = "0.5.2", features = ["add-extension", "cors", "sensitiv tracing = { version = "0.1.40", features = [] } tracing-flame = "0.2.0" tracing-opentelemetry = "0.24.0" -tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +tracing-subscriber = { version = "0.3.18", features = ["env-filter", "json"] } trust-dns-resolver = "0.23.2" xdg = "2.5.2" diff --git a/src/config.rs b/src/config.rs index af01282a..89b91dec 100644 --- a/src/config.rs +++ b/src/config.rs @@ -77,6 +77,10 @@ pub(crate) struct Config { pub(crate) trusted_servers: Vec, #[serde(default = "default_log")] pub(crate) log: EnvFilterClone, + #[serde(default = "true_fn")] + pub(crate) log_colors: bool, + #[serde(default)] + pub(crate) log_format: LogFormat, #[serde(default)] pub(crate) turn_username: String, #[serde(default)] @@ -110,6 +114,20 @@ pub(crate) enum ListenConfig { }, } +#[derive(Copy, Clone, Default, Debug, Deserialize)] +#[serde(rename_all = "snake_case")] +pub(crate) enum LogFormat { + /// Use the [`tracing_subscriber::fmt::format::Pretty`] formatter + Pretty, + /// Use the [`tracing_subscriber::fmt::format::Full`] formatter + #[default] + Full, + /// Use the [`tracing_subscriber::fmt::format::Compact`] formatter + Compact, + /// Use the [`tracing_subscriber::fmt::format::Json`] formatter + Json, +} + impl Display for ListenConfig { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { diff --git a/src/observability.rs b/src/observability.rs index b6ded983..0204de0e 100644 --- a/src/observability.rs +++ b/src/observability.rs @@ -23,7 +23,11 @@ use tokio::time::Instant; use tracing_flame::{FlameLayer, FlushGuard}; use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Layer, Registry}; -use crate::{config::Config, error, utils::error::Result}; +use crate::{ + config::{Config, LogFormat}, + error, + utils::error::Result, +}; /// Globally accessible metrics state pub(crate) static METRICS: Lazy = Lazy::new(Metrics::new); @@ -119,8 +123,15 @@ pub(crate) fn init(config: &Config) -> Result { .transpose()? .unzip(); - let fmt_layer = tracing_subscriber::fmt::Layer::new() - .with_filter(EnvFilter::from(&config.log)); + let fmt_layer = + tracing_subscriber::fmt::Layer::new().with_ansi(config.log_colors); + let fmt_layer = match config.log_format { + LogFormat::Pretty => fmt_layer.pretty().boxed(), + LogFormat::Full => fmt_layer.boxed(), + LogFormat::Compact => fmt_layer.compact().boxed(), + LogFormat::Json => fmt_layer.json().boxed(), + }; + let fmt_layer = fmt_layer.with_filter(EnvFilter::from(&config.log)); let subscriber = Registry::default() .with(jaeger_layer)