use crate::telemetry::settings::rate_limit::RateLimitingSettings;
use crate::utils::feature_use;
use std::path::PathBuf;
feature_use!(cfg(feature = "logging"), {
use slog::{Never, SendSyncRefUnwindSafeDrain};
use std::sync::Arc;
pub use slog::Level;
pub type CustomDrain = Arc<dyn SendSyncRefUnwindSafeDrain<Ok = (), Err = Never>>;
});
feature_use!(cfg(feature = "settings"), {
use crate::settings::settings;
});
#[cfg_attr(feature = "settings", settings(crate_path = "crate"))]
#[cfg_attr(not(feature = "settings"), derive(Clone, Default, Debug))]
pub struct LoggingSettings {
pub output: LogOutput,
pub format: LogFormat,
pub verbosity: LogVerbosity,
pub redact_keys: Vec<String>,
pub rate_limit: RateLimitingSettings,
pub log_volume_metrics: LogVolumeMetricSettings,
}
#[cfg_attr(
feature = "settings",
settings(crate_path = "crate", impl_debug = false)
)]
#[cfg_attr(not(feature = "settings"), derive(Clone, Default))]
pub enum LogOutput {
#[default]
Terminal,
Stderr,
File(PathBuf),
#[cfg(feature = "tracing-rs-compat")]
TracingRsCompat,
#[cfg(feature = "logging")]
#[cfg_attr(feature = "settings", serde(skip))]
Custom(CustomDrain),
}
impl std::fmt::Debug for LogOutput {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Terminal => write!(f, "Terminal"),
Self::Stderr => write!(f, "Stderr"),
Self::File(path) => f.debug_tuple("File").field(path).finish(),
#[cfg(feature = "tracing-rs-compat")]
Self::TracingRsCompat => write!(f, "TracingRsCompat"),
#[cfg(feature = "logging")]
Self::Custom(_) => write!(f, "Custom(...)"),
}
}
}
#[cfg_attr(feature = "settings", settings(crate_path = "crate"))]
#[cfg_attr(not(feature = "settings"), derive(Clone, Default, Debug))]
#[derive(Copy)]
pub enum LogFormat {
#[default]
Text,
Json,
}
#[cfg_attr(
feature = "settings",
settings(crate_path = "crate", impl_default = false)
)]
#[cfg_attr(not(feature = "settings"), derive(Clone, Debug))]
#[derive(Copy, Default)]
pub enum LogVerbosity {
#[cfg_attr(feature = "settings", serde(rename = "CRITICAL"))]
Critical,
#[cfg_attr(feature = "settings", serde(rename = "ERROR"))]
Error,
#[cfg_attr(feature = "settings", serde(rename = "WARN"))]
Warning,
#[default]
#[cfg_attr(feature = "settings", serde(rename = "INFO"))]
Info,
#[cfg_attr(feature = "settings", serde(rename = "DEBUG"))]
Debug,
#[cfg_attr(feature = "settings", serde(rename = "TRACE"))]
Trace,
}
impl From<slog::Level> for LogVerbosity {
fn from(level: slog::Level) -> Self {
match level {
Level::Critical => Self::Critical,
Level::Warning => Self::Warning,
Level::Error => Self::Error,
Level::Info => Self::Info,
Level::Debug => Self::Debug,
Level::Trace => Self::Trace,
}
}
}
impl From<LogVerbosity> for slog::Level {
fn from(level: LogVerbosity) -> Self {
match level {
LogVerbosity::Critical => Self::Critical,
LogVerbosity::Warning => Self::Warning,
LogVerbosity::Error => Self::Error,
LogVerbosity::Info => Self::Info,
LogVerbosity::Debug => Self::Debug,
LogVerbosity::Trace => Self::Trace,
}
}
}
#[cfg_attr(feature = "settings", settings(crate_path = "crate"))]
#[cfg_attr(not(feature = "settings"), derive(Clone, Debug, Default))]
pub struct LogVolumeMetricSettings {
pub enabled: bool,
}