diff --git a/Cargo.lock b/Cargo.lock index bc9f7d75..56360db5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5216,6 +5216,7 @@ dependencies = [ "tokio", "tokio-util", "tracing", + "tracing-subscriber", "url", "wiremock", ] diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index ce98d69d..0be8cbdc 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -49,6 +49,7 @@ sha2.workspace = true [dev-dependencies] tempfile.workspace = true +tracing-subscriber.workspace = true test-case.workspace = true backon.workspace = true wiremock.workspace = true diff --git a/crates/cli/src/commands/relay.rs b/crates/cli/src/commands/relay.rs index 4ae7317d..763d3942 100644 --- a/crates/cli/src/commands/relay.rs +++ b/crates/cli/src/commands/relay.rs @@ -12,6 +12,16 @@ use tracing::{error, info}; /// once `BackgroundTaskController::shutdown` has been signalled. const LOKI_FLUSH_TIMEOUT: Duration = Duration::from_secs(3); +/// Adds a `libp2p_relay` directive to the `base` env filter, which `EnvFilter` +/// prefix-matches against every `libp2p_relay::*` target. +fn relay_filter(base: &str, relay_level: &str) -> String { + if relay_level.is_empty() { + base.to_string() + } else { + format!("{base},libp2p_relay={relay_level}") + } +} + /// Arguments for the relay command. #[derive(clap::Args, Clone)] pub struct RelayArgs { @@ -90,14 +100,16 @@ impl TryInto for RelayArgs { } }; - let log_config = - build_console_tracing_config(self.log.level.clone(), &self.log.color, loki_config); + let log_config = build_console_tracing_config( + relay_filter(&self.log.level, &self.relay.p2p_relay_log_level), + &self.log.color, + loki_config, + ); let builder = pluto_relay_server::config::Config::builder() .data_dir(self.data_dir.data_dir) .http_addr(self.relay.http_address) .auto_p2p_key(self.relay.auto_p2p_key) - .libp2p_log_level(self.relay.p2p_relay_log_level) .max_res_per_peer(self.relay.max_res_per_peer) .max_conns(self.relay.max_conns) // Invert p2p-advertise-private-addresses flag boolean: @@ -381,6 +393,8 @@ mod tests { use std::{str::FromStr, time}; use tokio::net; use tokio_util::sync::CancellationToken; + use tracing::{Level, enabled}; + use tracing_subscriber::{EnvFilter, layer::SubscriberExt as _}; #[tokio::test] async fn run_bootnode() { @@ -640,4 +654,24 @@ mod tests { .build(); request.retry(&mut backoff).await } + + /// Runs `f` with a subscriber that only lets `filter` through. + fn with_filter(filter: &str, f: impl FnOnce()) { + let filter = EnvFilter::from_str(filter).expect("relay filter should be a valid EnvFilter"); + tracing::subscriber::with_default(tracing_subscriber::registry().with(filter), f); + } + + #[test] + fn relay_filter_scopes_upstream_relay_logs() { + // An empty relay level leaves the base filter alone. + with_filter(&super::relay_filter("info", ""), || { + assert!(enabled!(target: "libp2p_relay::behaviour::handler", Level::WARN)); + }); + + // A relay level silences the upstream relay crate but not our own logs. + with_filter(&super::relay_filter("info", "error"), || { + assert!(!enabled!(target: "libp2p_relay::behaviour::handler", Level::WARN)); + assert!(enabled!(target: "pluto_relay_server::p2p", Level::INFO)); + }); + } } diff --git a/crates/relay-server/src/config.rs b/crates/relay-server/src/config.rs index d77596a9..4deb6622 100644 --- a/crates/relay-server/src/config.rs +++ b/crates/relay-server/src/config.rs @@ -49,9 +49,6 @@ pub struct Config { /// Whether to filter private addresses. #[builder(default = false)] pub filter_private_addrs: bool, - /// LibP2PLogLevel. - #[builder(default = "Info".to_string())] - pub libp2p_log_level: String, } pub(crate) fn create_relay_config(config: &Config) -> relay::Config {