From 433bf824f9a854f5f2a949112d4323a238268655 Mon Sep 17 00:00:00 2001 From: binarybaron <86064887+binarybaron@users.noreply.github.com> Date: Sat, 12 Aug 2023 17:16:23 +0200 Subject: [PATCH] Append all cli logs to single log file After careful consideration, I've concluded that it's not practical/possible to ensure that the previous behaviour (one log file per swap) is preserved due to limitations of the tracing-subscriber crate and a big in the built in JSON formatter --- swap/src/api.rs | 2 +- swap/src/cli/tracing.rs | 75 +++++++++++++++-------------------------- 2 files changed, 29 insertions(+), 48 deletions(-) diff --git a/swap/src/api.rs b/swap/src/api.rs index 8f3db7bb..2b86d5e2 100644 --- a/swap/src/api.rs +++ b/swap/src/api.rs @@ -93,7 +93,7 @@ impl Context { let tor_socks5_port = tor.map(|tor| tor.tor_socks5_port); START.call_once(|| { - let _ = cli::tracing::init(debug, json, data_dir.join("logs"), None); + let _ = cli::tracing::init(debug, json, data_dir.join("logs")); }); let context = Context { diff --git a/swap/src/cli/tracing.rs b/swap/src/cli/tracing.rs index a1cd77fb..21a76199 100644 --- a/swap/src/cli/tracing.rs +++ b/swap/src/cli/tracing.rs @@ -7,55 +7,36 @@ use tracing::{Event, Level, Subscriber}; use tracing_subscriber::fmt::format::{DefaultFields, Format, JsonFields}; use tracing_subscriber::fmt::time::UtcTime; use tracing_subscriber::layer::{Context, SubscriberExt}; -use tracing_subscriber::{fmt, EnvFilter, FmtSubscriber, Layer, Registry}; -use uuid::Uuid; +use tracing_subscriber::{fmt, EnvFilter, Layer, Registry}; -pub fn init(debug: bool, json: bool, dir: impl AsRef, swap_id: Option) -> Result<()> { - if let Some(swap_id) = swap_id { - let level_filter = EnvFilter::try_new("swap=debug")?; +pub fn init(debug: bool, json: bool, dir: impl AsRef) -> Result<()> { + let level_filter = EnvFilter::try_new("swap=debug")?; + let registry = Registry::default().with(level_filter); - let registry = Registry::default().with(level_filter); + let appender = + tracing_appender::rolling::never(dir.as_ref(), "swap-all.log"); + let (appender, guard) = tracing_appender::non_blocking(appender); - let appender = - tracing_appender::rolling::never(dir.as_ref(), format!("swap-{}.log", swap_id)); - let (appender, guard) = tracing_appender::non_blocking(appender); + std::mem::forget(guard); - std::mem::forget(guard); + let file_logger = registry.with( + fmt::layer() + .with_ansi(false) + .with_target(false) + .with_span_events(fmt::format::FmtSpan::FULL) + .json() + .with_writer(appender), + ); - let file_logger = registry.with( - fmt::layer() - .with_ansi(false) - .with_target(false) - .json() - .with_writer(appender), - ); - - if json && debug { - set_global_default(file_logger.with(debug_json_terminal_printer()))?; - } else if json && !debug { - set_global_default(file_logger.with(info_json_terminal_printer()))?; - } else if !json && debug { - set_global_default(file_logger.with(debug_terminal_printer()))?; - } else { - set_global_default(file_logger.with(info_terminal_printer()))?; - } + if json && debug { + set_global_default(file_logger.with(debug_json_terminal_printer()))?; + } else if json && !debug { + set_global_default(file_logger.with(info_json_terminal_printer()))?; + } else if !json && debug { + set_global_default(file_logger.with(debug_terminal_printer()))?; } else { - let level = if debug { Level::DEBUG } else { Level::INFO }; - let is_terminal = atty::is(atty::Stream::Stderr); - - let builder = FmtSubscriber::builder() - .with_env_filter(format!("swap={}", level)) - .with_writer(std::io::stderr) - .with_ansi(is_terminal) - .with_timer(UtcTime::rfc_3339()) - .with_target(false); - - if json { - builder.json().init(); - } else { - builder.init(); - } - }; + set_global_default(file_logger.with(info_terminal_printer()))?; + } tracing::info!("Logging initialized to {}", dir.as_ref().display()); Ok(()) @@ -66,17 +47,17 @@ pub struct StdErrPrinter { level: Level, } -type StdErrLayer = tracing_subscriber::fmt::Layer< +type StdErrLayer = fmt::Layer< S, DefaultFields, - Format, + Format, fn() -> std::io::Stderr, >; -type StdErrJsonLayer = tracing_subscriber::fmt::Layer< +type StdErrJsonLayer = fmt::Layer< S, JsonFields, - Format, + Format, fn() -> std::io::Stderr, >;