From 96d43b60844b1ea8f3e38f3276f45f760609302e Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Sat, 18 May 2024 14:38:43 +0200 Subject: [PATCH] ....just do it yourself... --- Cargo.lock | 1 + Cargo.toml | 1 + src/context.rs | 72 ++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a65ae9fe0..72eef74e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1426,6 +1426,7 @@ dependencies = [ "tokio-tar", "tokio-util", "toml", + "tracing", "tracing-subscriber", "url", "uuid", diff --git a/Cargo.toml b/Cargo.toml index e6b8085f6..cba77f1f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -113,6 +113,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } # According to # 3.1 branch will be supported until 2025-03-14. openssl-src = "~300.1" +tracing = "0.1.40" [dev-dependencies] diff --git a/src/context.rs b/src/context.rs index c91abff46..9ff440705 100644 --- a/src/context.rs +++ b/src/context.rs @@ -339,8 +339,37 @@ impl Context { stock_strings: StockStrings, ) -> Result { // set the RUST_LOG env var to one of {debug,info,warn} to see logging info + struct DeltaLayer(Context); + + impl tracing_subscriber::Layer for DeltaLayer { + fn on_event( + &self, + event: &tracing::Event<'_>, + _ctx: tracing_subscriber::layer::Context<'_, S>, + ) { + let mut visitor = CollectVisitor::default(); + event.record(&mut visitor); + + use tracing::Level; + + let out_event = if event.metadata().level() == &Level::WARN { + EventType::Warning(format!("{:?}", visitor)) + } else if event.metadata().level() == &Level::ERROR { + EventType::Error(format!("{:?}", visitor)) + } else { + EventType::Info(format!("{:?}", visitor)) + }; + + self.0.emit_event(out_event); + } + } + + let context = + Self::new_closed(dbfile, id, events, stock_strings, Default::default()).await?; + tracing_subscriber::registry() - .with(tracing_subscriber::fmt::layer().with_writer(std::io::stdout)) + // .with(tracing_subscriber::fmt::layer().with_writer(std::io::stdout)) + .with(DeltaLayer(context.clone())) .with( EnvFilter::builder() .with_default_directive(tracing_subscriber::filter::LevelFilter::DEBUG.into()) @@ -348,10 +377,6 @@ impl Context { ) .try_init() .ok(); - - let context = - Self::new_closed(dbfile, id, events, stock_strings, Default::default()).await?; - // Open the database if is not encrypted. if context.check_passphrase("".to_string()).await? { context.sql.open(&context, "".to_string()).await?; @@ -1388,6 +1413,43 @@ pub fn get_version_str() -> &'static str { &DC_VERSION_STR } +#[derive(Default, Debug)] +struct CollectVisitor(HashMap); + +impl tracing::field::Visit for CollectVisitor { + fn record_f64(&mut self, field: &tracing::field::Field, value: f64) { + self.0.insert(field.to_string(), value.to_string()); + } + + fn record_i64(&mut self, field: &tracing::field::Field, value: i64) { + self.0.insert(field.to_string(), value.to_string()); + } + + fn record_u64(&mut self, field: &tracing::field::Field, value: u64) { + self.0.insert(field.to_string(), value.to_string()); + } + + fn record_bool(&mut self, field: &tracing::field::Field, value: bool) { + self.0.insert(field.to_string(), value.to_string()); + } + + fn record_str(&mut self, field: &tracing::field::Field, value: &str) { + self.0.insert(field.to_string(), value.to_string()); + } + + fn record_error( + &mut self, + field: &tracing::field::Field, + value: &(dyn std::error::Error + 'static), + ) { + self.0.insert(field.to_string(), value.to_string()); + } + + fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) { + self.0.insert(field.to_string(), format!("{:?}", value)); + } +} + #[cfg(test)] mod tests { use anyhow::Context as _;