From f6643c53f4b4c62db6d1feda89ada95ad11c1eb0 Mon Sep 17 00:00:00 2001 From: Xiangfei Ding Date: Fri, 17 Oct 2025 15:35:43 +0000 Subject: [PATCH] Apply dynamic filter again for individual events It turns out that the `event_enabled` is not yet implemented on `EnvFilter`. It has created issues that dynamic filters are effectively ignored, when this filter is composed with another layer through `with_filter` combinator. Related to rust-lang/rust#147613 Signed-off-by: Xiangfei Ding --- tracing-subscriber/src/filter/env/mod.rs | 30 +++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tracing-subscriber/src/filter/env/mod.rs b/tracing-subscriber/src/filter/env/mod.rs index 04abd5917..d1a03fc0d 100644 --- a/tracing-subscriber/src/filter/env/mod.rs +++ b/tracing-subscriber/src/filter/env/mod.rs @@ -24,7 +24,7 @@ use tracing_core::{ field::Field, span, subscriber::{Interest, Subscriber}, - Metadata, + Event, Metadata, }; /// A [`Layer`] which filters spans and events based on a set of filter @@ -539,6 +539,30 @@ impl EnvFilter { false } + fn event_enabled(&self, event: &Event<'_>, _: &Context<'_, S>) -> bool { + let metadata = event.metadata(); + let &level = metadata.level(); + if self.has_dynamics && self.dynamics.max_level >= level { + // We test against callsite one more time for the event + let enabled_by_cs = self + .by_cs + .read() + .ok() + .map_or(false, |by_cs| by_cs.contains_key(&metadata.callsite())); + if enabled_by_cs { + return true; + } + + let scope = self.scope.get_or_default().borrow(); + if scope.is_empty() { + return false; + } + return scope.iter().any(|&filter| filter >= level); + } + // Somehow the event hits here even though static checks should filter it out? + false + } + /// Returns an optional hint of the highest [verbosity level][level] that /// this `EnvFilter` will enable. /// @@ -711,6 +735,10 @@ feature! { self.enabled(meta, ctx.clone()) } + fn event_enabled(&self, event: &Event<'_>, cx: &Context<'_, S>) -> bool { + self.event_enabled(event, cx) + } + #[inline] fn callsite_enabled(&self, meta: &'static Metadata<'static>) -> Interest { self.register_callsite(meta)