tracing icon indicating copy to clipboard operation
tracing copied to clipboard

tracing-subscriber: `Filtered` does not respect global filters properly

Open jstarks opened this issue 1 year ago • 0 comments

Bug Report

Version

├── tracing v0.1.40
│   ├── tracing-attributes v0.1.27 (proc-macro)
│   └── tracing-core v0.1.32
└── tracing-subscriber v0.3.18
    ├── tracing-core v0.1.32 (*)
    └── tracing-log v0.2.0
        └── tracing-core v0.1.32 (*)

Description

The Filtered type unconditionally returns Interest::always from register_callsite(). As a result, if the Filtered type is filtering over a global filter, the global filter has no effect. This seems undesirable. It should either return Interest::sometimes so that enabled is called for each event, or (preferred, for performance) it should pass through to its inner layer's register_callsite() method.

Repro:

use tracing_subscriber::filter::FilterFn;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::Layer;

fn main() {
    let disable_all = FilterFn::new(|_| false);
    let enable_all = FilterFn::new(|_| true);

    tracing_subscriber::registry()
        .with(
            Layer::and_then(disable_all, tracing_subscriber::fmt::layer()).with_filter(enable_all),
        )
        .init();

    tracing::info!("you had better not see this");
}

Expected:

[no output]

Actual:

2024-01-24T21:50:12.178070Z  INFO bug: you had better not see this

jstarks avatar Jan 24 '24 21:01 jstarks