Tracing-subscriber's EnvFilter syntax is confusing

From EnvFilter in tracing_subscriber::filter - Rust and for the following code, I'd expect some valid syntax should have worked.

use tracing_subscriber::{fmt, prelude::*, EnvFilter};

#[macro_use]
extern crate tracing;

fn main() {
    tracing_subscriber::registry()
        .with(fmt::layer())
        .with(EnvFilter::from_default_env())
        .init();

    f();
}

fn f() {
    let b = 1;
    debug_span!(target: "my", "a").in_scope(|| debug!(b));
}
RUST_LOG=[a] cargo r # good output: DEBUG a: tracing_filter: b=1
RUST_LOG=[{b}] cargo r # good as above

RUST_LOG=[{b=1}] cargo r # no output: bad
RUST_LOG=[a{b}] cargo r # no output: bad

# specify the target
RUST_LOG=my cargo r # no output: bad
RUST_LOG=my=debug cargo r # no output: bad
RUST_LOG=my[a]=debug cargo r # good: DEBUG a: tracing_filter: b=1
RUST_LOG=my[{b}]=debug cargo r # no output: bad

It turns out the functionality is buggy and documentation on EnvFilter is out of date for years.