1 #![cfg(feature = "reload")]
2 use std
::sync
::atomic
::{AtomicUsize, Ordering}
;
4 span
::{Attributes, Id, Record}
,
6 Event
, Metadata
, Subscriber
,
8 use tracing_subscriber
::{layer, prelude::*, reload::*}
;
10 pub struct NopSubscriber
;
12 impl Subscriber
for NopSubscriber
{
13 fn register_callsite(&self, _
: &'
static Metadata
<'
static>) -> Interest
{
17 fn enabled(&self, _
: &Metadata
<'_
>) -> bool
{
21 fn new_span(&self, _
: &Attributes
<'_
>) -> Id
{
25 fn record(&self, _
: &Id
, _
: &Record
<'_
>) {}
26 fn record_follows_from(&self, _
: &Id
, _
: &Id
) {}
27 fn event(&self, _
: &Event
<'_
>) {}
28 fn enter(&self, _
: &Id
) {}
29 fn exit(&self, _
: &Id
) {}
34 static FILTER1_CALLS
: AtomicUsize
= AtomicUsize
::new(0);
35 static FILTER2_CALLS
: AtomicUsize
= AtomicUsize
::new(0);
42 impl<S
: Subscriber
> tracing_subscriber
::Layer
<S
> for Filter
{
43 fn register_callsite(&self, m
: &Metadata
<'_
>) -> Interest
{
44 println
!("REGISTER: {:?}", m
);
48 fn enabled(&self, m
: &Metadata
<'_
>, _
: layer
::Context
<'_
, S
>) -> bool
{
49 println
!("ENABLED: {:?}", m
);
51 Filter
::One
=> FILTER1_CALLS
.fetch_add(1, Ordering
::SeqCst
),
52 Filter
::Two
=> FILTER2_CALLS
.fetch_add(1, Ordering
::SeqCst
),
58 tracing
::trace
!("my event");
61 let (layer
, handle
) = Layer
::new(Filter
::One
);
63 let subscriber
= tracing_core
::dispatcher
::Dispatch
::new(layer
.with_subscriber(NopSubscriber
));
65 tracing_core
::dispatcher
::with_default(&subscriber
, || {
66 assert_eq
!(FILTER1_CALLS
.load(Ordering
::SeqCst
), 0);
67 assert_eq
!(FILTER2_CALLS
.load(Ordering
::SeqCst
), 0);
71 assert_eq
!(FILTER1_CALLS
.load(Ordering
::SeqCst
), 1);
72 assert_eq
!(FILTER2_CALLS
.load(Ordering
::SeqCst
), 0);
74 handle
.reload(Filter
::Two
).expect("should reload");
78 assert_eq
!(FILTER1_CALLS
.load(Ordering
::SeqCst
), 1);
79 assert_eq
!(FILTER2_CALLS
.load(Ordering
::SeqCst
), 1);