#[cfg(feature = "tracing")]
pub use tracing::{self, debug, error, info, instrument, trace, warn};
#[cfg(feature = "tracing")]
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
#[cfg(feature = "tracing")]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TracingFormat {
Pretty,
Compact,
Json,
}
#[cfg(feature = "tracing")]
#[derive(Debug, Clone)]
pub struct TracingConfig {
pub level: Option<tracing::Level>,
pub format: TracingFormat,
pub timestamps: bool,
pub target: bool,
pub thread_ids: bool,
}
#[cfg(feature = "tracing")]
impl Default for TracingConfig {
fn default() -> Self {
Self {
level: None,
format: TracingFormat::Pretty,
timestamps: true,
target: true,
thread_ids: false,
}
}
}
#[cfg(feature = "tracing")]
pub fn init_subscriber() {
let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
tracing_subscriber::registry()
.with(filter)
.with(tracing_subscriber::fmt::layer())
.init();
}
#[cfg(feature = "tracing")]
pub fn init_subscriber_with_config(config: TracingConfig) {
let filter = if let Some(level) = config.level {
EnvFilter::new(level.to_string())
} else {
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"))
};
match (config.format, config.timestamps) {
(TracingFormat::Pretty, true) => {
tracing_subscriber::registry()
.with(filter)
.with(
tracing_subscriber::fmt::layer()
.pretty()
.with_target(config.target)
.with_thread_ids(config.thread_ids),
)
.init();
}
(TracingFormat::Pretty, false) => {
tracing_subscriber::registry()
.with(filter)
.with(
tracing_subscriber::fmt::layer()
.pretty()
.without_time()
.with_target(config.target)
.with_thread_ids(config.thread_ids),
)
.init();
}
(TracingFormat::Compact, true) => {
tracing_subscriber::registry()
.with(filter)
.with(
tracing_subscriber::fmt::layer()
.compact()
.with_target(config.target)
.with_thread_ids(config.thread_ids),
)
.init();
}
(TracingFormat::Compact, false) => {
tracing_subscriber::registry()
.with(filter)
.with(
tracing_subscriber::fmt::layer()
.compact()
.without_time()
.with_target(config.target)
.with_thread_ids(config.thread_ids),
)
.init();
}
(TracingFormat::Json, true) => {
tracing_subscriber::registry()
.with(filter)
.with(
tracing_subscriber::fmt::layer()
.json()
.with_target(config.target)
.with_thread_ids(config.thread_ids),
)
.init();
}
(TracingFormat::Json, false) => {
tracing_subscriber::registry()
.with(filter)
.with(
tracing_subscriber::fmt::layer()
.json()
.without_time()
.with_target(config.target)
.with_thread_ids(config.thread_ids),
)
.init();
}
}
}
#[cfg(not(feature = "tracing"))]
pub fn init_subscriber() {
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[cfg(feature = "tracing")]
fn test_default_config() {
let config = TracingConfig::default();
assert_eq!(config.format, TracingFormat::Pretty);
assert!(config.timestamps);
assert!(config.target);
assert!(!config.thread_ids);
}
}