Function tracing_subscriber::filter::dynamic_filter_fn

source ·
pub fn dynamic_filter_fn<S, F>(f: F) -> DynFilterFn<S, F>
where F: Fn(&Metadata<'_>, &Context<'_, S>) -> bool,
Expand description

Constructs a DynFilterFn from a function or closure that returns true if a span or event should be enabled within a particular span context.

This is equivalent to calling DynFilterFn::new.

Unlike filter_fn, this function takes a closure or function pointer taking the Metadata for a span or event and the current Context. This means that a DynFilterFn can choose whether to enable spans or events based on information about the current span (or its parents).

If this is not necessary, use filter_fn instead.

The returned DynFilterFn can be used for both per-layer filtering (using its Filter implementation) and global filtering (using its Layer implementation).

See the documentation on filtering with layers for details.

§Examples

use tracing_subscriber::{
    layer::{Layer, SubscriberExt},
    filter,
    util::SubscriberInitExt,
};

// Only enable spans or events within a span named "interesting_span".
let my_filter = filter::dynamic_filter_fn(|metadata, cx| {
    // If this *is* "interesting_span", make sure to enable it.
    if metadata.is_span() && metadata.name() == "interesting_span" {
        return true;
    }

    // Otherwise, are we in an interesting span?
    if let Some(current_span) = cx.lookup_current() {
        return current_span.name() == "interesting_span";
    }

    false
});

let my_layer = tracing_subscriber::fmt::layer();

tracing_subscriber::registry()
    .with(my_layer.with_filter(my_filter))
    .init();

// This event will not be enabled.
tracing::info!("something happened");

tracing::info_span!("interesting_span").in_scope(|| {
    // This event will be enabled.
    tracing::debug!("something else happened");
});