#[derive(Debug, Clone)]
pub enum LoggingConfig {
Server,
Development,
Test,
IntegrationTest,
Custom { level: log::LevelFilter },
}
pub fn init_logging(config: LoggingConfig) {
match config {
LoggingConfig::Server => init_server_logging(),
LoggingConfig::Development => init_development_logging(),
LoggingConfig::Test => init_test_logging(),
LoggingConfig::IntegrationTest => init_integration_test_logging(),
LoggingConfig::Custom { level } => init_custom_logging(level),
}
}
pub fn init_server_logging() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Warn)
.format_timestamp_secs()
.format_module_path(false)
.try_init();
}
pub fn init_development_logging() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.format_timestamp_secs()
.try_init();
}
pub fn init_test_logging() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Debug)
.is_test(true)
.try_init();
}
pub fn init_integration_test_logging() {
let _ = env_logger::builder()
.filter_level(log::LevelFilter::Info)
.is_test(true)
.try_init();
}
pub fn init_custom_logging(level: log::LevelFilter) {
let _ = env_logger::builder().filter_level(level).try_init();
}
pub fn init_env_logging() {
let _ = env_logger::builder()
.filter_level(
std::env::var("LOG_LEVEL")
.ok()
.and_then(|level| level.parse::<log::LevelFilter>().ok())
.unwrap_or(log::LevelFilter::Info),
)
.try_init();
}
#[cfg(feature = "tracing")]
pub fn init_tracing_logging(level: tracing::Level) {
use tracing_subscriber::prelude::*;
let _ = tracing_subscriber::registry()
.with(tracing_subscriber::fmt::layer().with_filter(
tracing_subscriber::EnvFilter::from_default_env().add_directive(level.into()),
))
.try_init();
}
pub fn init_external_tracing_logging(verbose: bool) {
if verbose {
log::info!("Verbose logging enabled (external tracing should be configured by caller)");
} else {
log::info!("Standard logging enabled (external tracing should be configured by caller)");
}
}
pub fn detect_logging_config() -> LoggingConfig {
if let Ok(level_str) = std::env::var("LOG_LEVEL") {
if let Ok(level) = level_str.parse::<log::LevelFilter>() {
return LoggingConfig::Custom { level };
}
}
if cfg!(test) || std::env::var("RUST_TEST_THREADS").is_ok() {
return LoggingConfig::Test;
}
if cfg!(debug_assertions) {
LoggingConfig::Development
} else {
LoggingConfig::Server
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_logging_config_detection() {
let config = detect_logging_config();
matches!(config, LoggingConfig::Test);
}
#[test]
fn test_logging_initialization() {
init_logging(LoggingConfig::Test);
log::info!("Test logging message");
}
}