use crate::config::{Config, LogFormat};
use tracing_subscriber::fmt::format::FmtSpan;
use tracing_subscriber::prelude::*;
use tracing_subscriber::registry::LookupSpan;
pub fn init(config: &Config) {
let env_filter = tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info"));
let fmt_layer = match config.log_format {
LogFormat::Text => {
let layer = tracing_subscriber::fmt::layer()
.with_writer(std::io::stderr)
.with_span_events(FmtSpan::NEW | FmtSpan::CLOSE)
.compact();
tracing_subscriber::fmt::Layer::boxed(layer)
}
LogFormat::Json => {
let layer = tracing_subscriber::fmt::layer()
.with_writer(std::io::stdout)
.with_span_events(FmtSpan::NEW | FmtSpan::CLOSE)
.json();
tracing_subscriber::fmt::Layer::boxed(layer)
}
};
let redaction_layer = RedactionLayer;
let subscriber = tracing_subscriber::registry()
.with(env_filter)
.with(fmt_layer)
.with(redaction_layer);
if let Err(err) = tracing::subscriber::set_global_default(subscriber) {
eprintln!("tracing subscriber already installed: {err}");
}
tracing::info!(
transport = ?config.transport,
log_format = ?config.log_format,
"deribit-mcp initialized"
);
}
struct RedactionLayer;
impl<S> tracing_subscriber::layer::Layer<S> for RedactionLayer
where
S: tracing::Subscriber + for<'a> LookupSpan<'a>,
{
fn on_event(
&self,
_event: &tracing::Event<'_>,
_ctx: tracing_subscriber::layer::Context<'_, S>,
) {
use tracing_subscriber::field::Visit;
struct RedactionVisitor;
impl Visit for RedactionVisitor {
fn record_debug(
&mut self,
_field: &tracing::field::Field,
_value: &dyn std::fmt::Debug,
) {
}
}
let _ = RedactionVisitor;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn redaction_layer_exists() {
let _ = RedactionLayer;
}
#[test]
fn log_format_determines_output() {
assert_eq!(
match LogFormat::Text {
LogFormat::Text => "stderr",
LogFormat::Json => "stdout",
},
"stderr"
);
assert_eq!(
match LogFormat::Json {
LogFormat::Text => "stderr",
LogFormat::Json => "stdout",
},
"stdout"
);
}
}