Skip to content

tracing-subscriber EnvFilter directives do not filter by spans and values #3393

@h4-h

Description

@h4-h

Version

$  cargo --version && rustc --version

cargo 1.92.0-nightly (801d9b498 2025-10-04)
rustc 1.92.0-nightly (b925a865e 2025-10-09)

$ cargo tree | rg tracing

tracing-test v0.1.0 (/home/hash/Projects/tracing-test)
├── tracing v0.1.41
│   ├── tracing-attributes v0.1.30 (proc-macro)
│   └── tracing-core v0.1.34
└── tracing-subscriber v0.3.20
    ├── tracing v0.1.41 (*)
    ├── tracing-core v0.1.34 (*)
    └── tracing-log v0.2.0
        └── tracing-core v0.1.34 (*)

Platform

$ uname -a 

Linux home 6.17.1-zen1-1-zen #1 ZEN SMP PREEMPT_DYNAMIC x86_64 GNU/Linux

Crates

  • tracing-subscriber

Description

The span directives doesn't fully work. Only the target part works.

Code snippet

[dependencies]
tracing = "0.1.41"
tracing-subscriber = { version = "0.3.20", features = ["env-filter"] }
fn main() {
    // Default traces         = off
    // crate level traces     = info
    // enabled module traces  = trace
    // disabled module traces = off
    // disabled_span traces   = off
    // value=1 traces         = off
    let complicated_filter = format!(
        "info,[disabled_span]=off,[{{value=1}}]=off,[{{value=\"1\"}}]=off,{crate_name}::enabled_module=trace,{crate_name}::disabled_module=off",
        crate_name = env!("CARGO_PKG_NAME").replace("-", "_"),
    );

    tracing_subscriber::fmt()
        .with_env_filter(tracing_subscriber::EnvFilter::new(complicated_filter))
        .init();

    tracing::trace!("This will not be logged: crate level is 'info', but trace level is 'trace'");

    tracing::debug!("This will not be logged: crate level is 'info', but trace level is 'debug'");

    tracing::info!("This will be logged: crate level is 'info' and trace level is 'info'");

    enabled_module::trace();
    disabled_module::trace();
    trace_with_value(1);
    trace_with_value(2);

    tracing::info_span!("disabled_span").in_scope(|| {
        tracing::error!("This should not be logged, but it logged: 'disabled_span' level is 'off' and this trace is in 'disabled_span' span");
    });

    tracing::info!("This will be logged: crate level is 'info' and trace level is 'info'");
}

#[tracing::instrument]
fn trace_with_value(value: usize) {
    if value == 1 {
        tracing::error!(
            "This should not be logged, but it logged: 'value=1' is 'off' and this trace 'value=1'"
        );
    }
}

mod enabled_module {
    #[tracing::instrument]
    pub fn trace() {
        tracing::trace!(
            "This will be logged: crate::enabled_module level is 'trace' and this trace is in crate::enabled_module target"
        );
    }
}

mod disabled_module {
    #[tracing::instrument]
    pub fn trace() {
        tracing::error!(
            "This will not be logged: crate::disabled_module is 'off' and this trace is in crate::enabled_module target"
        );
    }
}

Output

2025-10-17T22:42:50.965310Z  INFO tracing_test: This will be logged: crate level is 'info' and trace level is 'info'
2025-10-17T22:42:50.965381Z TRACE trace: tracing_test::enabled_module: This will be logged: crate::enabled_module level is 'trace' and this trace is in crate::enabled_module target
2025-10-17T22:42:50.965470Z ERROR trace_with_value{value=1}: tracing_test: This should not be logged, but it logged: 'value=1' is 'off' and this trace 'value=1'
2025-10-17T22:42:50.965554Z ERROR disabled_span: tracing_test: This should not be logged, but it logged: 'disabled_span' level is 'off' and this trace is in 'disabled_span' span
2025-10-17T22:42:50.965588Z  INFO tracing_test: This will be logged: crate level is 'info' and trace level is 'info'

Expected output

Something like:

2025-10-17T22:42:50.965310Z  INFO tracing_test: This will be logged: crate level is 'info' and trace level is 'info'
2025-10-17T22:42:50.965381Z TRACE trace: tracing_test::enabled_module: This will be logged: crate::enabled_module level is 'trace' and this trace is in crate::enabled_module target
2025-10-17T22:42:50.965588Z  INFO tracing_test: This will be logged: crate level is 'info' and trace level is 'info'

It does not have ERROR disabled_span: tracing_test, ERROR trace_with_value{value=1}: tracing_test and it should not have it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions