use tracing::info;
use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt};
#[derive(Debug, Clone)]
pub struct LoggingConfig {
pub level: String,
pub json_format: bool,
pub filter_sensitive: bool,
pub file_path: Option<String>,
}
impl Default for LoggingConfig {
fn default() -> Self {
Self {
level: "info".to_string(),
json_format: false,
filter_sensitive: true,
file_path: None,
}
}
}
pub fn init_logging(config: &LoggingConfig) -> Result<(), Box<dyn std::error::Error>> {
let env_filter =
EnvFilter::try_from_default_env().or_else(|_| EnvFilter::try_new(&config.level))?;
let subscriber = tracing_subscriber::registry().with(env_filter);
if config.json_format {
let json_layer = tracing_subscriber::fmt::layer()
.json()
.with_current_span(true)
.with_span_list(true);
subscriber.with(json_layer).try_init()?;
} else {
let fmt_layer = tracing_subscriber::fmt::layer()
.with_target(true)
.with_thread_ids(true)
.with_file(true)
.with_line_number(true);
subscriber.with(fmt_layer).try_init()?;
}
info!("krx-rs logging initialized with level: {}", config.level);
Ok(())
}
#[macro_export]
macro_rules! log_filtered {
($level:ident, $msg:expr, $($key:ident = $value:expr),*) => {
$level!(
message = $msg,
$(
$key = if stringify!($key).contains("key") ||
stringify!($key).contains("auth") ||
stringify!($key).contains("token") {
"***FILTERED***"
} else {
&$value.to_string()
}
),*
);
};
}