#![cfg(feature = "reload")] use std::sync::atomic::{AtomicUsize, Ordering}; use tracing_core::{ span::{Attributes, Id, Record}, subscriber::Interest, Event, Metadata, Subscriber, }; use tracing_subscriber::{layer, prelude::*, reload::*}; pub struct NopSubscriber; impl Subscriber for NopSubscriber { fn register_callsite(&self, _: &'static Metadata<'static>) -> Interest { Interest::never() } fn enabled(&self, _: &Metadata<'_>) -> bool { false } fn new_span(&self, _: &Attributes<'_>) -> Id { Id::from_u64(1) } fn record(&self, _: &Id, _: &Record<'_>) {} fn record_follows_from(&self, _: &Id, _: &Id) {} fn event(&self, _: &Event<'_>) {} fn enter(&self, _: &Id) {} fn exit(&self, _: &Id) {} } #[test] fn reload_handle() { static FILTER1_CALLS: AtomicUsize = AtomicUsize::new(0); static FILTER2_CALLS: AtomicUsize = AtomicUsize::new(0); enum Filter { One, Two, } impl tracing_subscriber::Layer for Filter { fn register_callsite(&self, m: &Metadata<'_>) -> Interest { println!("REGISTER: {:?}", m); Interest::sometimes() } fn enabled(&self, m: &Metadata<'_>, _: layer::Context<'_, S>) -> bool { println!("ENABLED: {:?}", m); match self { Filter::One => FILTER1_CALLS.fetch_add(1, Ordering::SeqCst), Filter::Two => FILTER2_CALLS.fetch_add(1, Ordering::SeqCst), }; true } } fn event() { tracing::trace!("my event"); } let (layer, handle) = Layer::new(Filter::One); let subscriber = tracing_core::dispatcher::Dispatch::new(layer.with_subscriber(NopSubscriber)); tracing_core::dispatcher::with_default(&subscriber, || { assert_eq!(FILTER1_CALLS.load(Ordering::SeqCst), 0); assert_eq!(FILTER2_CALLS.load(Ordering::SeqCst), 0); event(); assert_eq!(FILTER1_CALLS.load(Ordering::SeqCst), 1); assert_eq!(FILTER2_CALLS.load(Ordering::SeqCst), 0); handle.reload(Filter::Two).expect("should reload"); event(); assert_eq!(FILTER1_CALLS.load(Ordering::SeqCst), 1); assert_eq!(FILTER2_CALLS.load(Ordering::SeqCst), 1); }) }