1 #![cfg(feature = "registry")]
2 use std
::sync
::atomic
::{AtomicUsize, Ordering}
;
4 span
::{Attributes, Id, Record}
,
6 Event
, LevelFilter
, Metadata
, Subscriber
,
8 use tracing_subscriber
::{layer, prelude::*, reload::*}
;
10 pub struct NopSubscriber
;
12 tracing
::info
!("my event");
15 impl Subscriber
for NopSubscriber
{
16 fn register_callsite(&self, _
: &'
static Metadata
<'
static>) -> Interest
{
20 fn enabled(&self, _
: &Metadata
<'_
>) -> bool
{
24 fn new_span(&self, _
: &Attributes
<'_
>) -> Id
{
28 fn record(&self, _
: &Id
, _
: &Record
<'_
>) {}
29 fn record_follows_from(&self, _
: &Id
, _
: &Id
) {}
30 fn event(&self, _
: &Event
<'_
>) {}
31 fn enter(&self, _
: &Id
) {}
32 fn exit(&self, _
: &Id
) {}
37 static FILTER1_CALLS
: AtomicUsize
= AtomicUsize
::new(0);
38 static FILTER2_CALLS
: AtomicUsize
= AtomicUsize
::new(0);
45 impl<S
: Subscriber
> tracing_subscriber
::Layer
<S
> for Filter
{
46 fn register_callsite(&self, m
: &Metadata
<'_
>) -> Interest
{
47 println
!("REGISTER: {:?}", m
);
51 fn enabled(&self, m
: &Metadata
<'_
>, _
: layer
::Context
<'_
, S
>) -> bool
{
52 println
!("ENABLED: {:?}", m
);
54 Filter
::One
=> FILTER1_CALLS
.fetch_add(1, Ordering
::SeqCst
),
55 Filter
::Two
=> FILTER2_CALLS
.fetch_add(1, Ordering
::SeqCst
),
60 fn max_level_hint(&self) -> Option
<LevelFilter
> {
62 Filter
::One
=> Some(LevelFilter
::INFO
),
63 Filter
::Two
=> Some(LevelFilter
::DEBUG
),
68 let (layer
, handle
) = Layer
::new(Filter
::One
);
70 let subscriber
= tracing_core
::dispatcher
::Dispatch
::new(layer
.with_subscriber(NopSubscriber
));
72 tracing_core
::dispatcher
::with_default(&subscriber
, || {
73 assert_eq
!(FILTER1_CALLS
.load(Ordering
::SeqCst
), 0);
74 assert_eq
!(FILTER2_CALLS
.load(Ordering
::SeqCst
), 0);
78 assert_eq
!(FILTER1_CALLS
.load(Ordering
::SeqCst
), 1);
79 assert_eq
!(FILTER2_CALLS
.load(Ordering
::SeqCst
), 0);
81 assert_eq
!(LevelFilter
::current(), LevelFilter
::INFO
);
82 handle
.reload(Filter
::Two
).expect("should reload");
83 assert_eq
!(LevelFilter
::current(), LevelFilter
::DEBUG
);
87 assert_eq
!(FILTER1_CALLS
.load(Ordering
::SeqCst
), 1);
88 assert_eq
!(FILTER2_CALLS
.load(Ordering
::SeqCst
), 1);
95 impl<S
: Subscriber
> tracing_subscriber
::Layer
<S
> for NopLayer
{
96 fn register_callsite(&self, _m
: &Metadata
<'_
>) -> Interest
{
100 fn enabled(&self, _m
: &Metadata
<'_
>, _
: layer
::Context
<'_
, S
>) -> bool
{
105 static FILTER1_CALLS
: AtomicUsize
= AtomicUsize
::new(0);
106 static FILTER2_CALLS
: AtomicUsize
= AtomicUsize
::new(0);
113 impl<S
: Subscriber
> tracing_subscriber
::layer
::Filter
<S
> for Filter
{
114 fn enabled(&self, m
: &Metadata
<'_
>, _
: &layer
::Context
<'_
, S
>) -> bool
{
115 println
!("ENABLED: {:?}", m
);
117 Filter
::One
=> FILTER1_CALLS
.fetch_add(1, Ordering
::SeqCst
),
118 Filter
::Two
=> FILTER2_CALLS
.fetch_add(1, Ordering
::SeqCst
),
123 fn max_level_hint(&self) -> Option
<LevelFilter
> {
125 Filter
::One
=> Some(LevelFilter
::INFO
),
126 Filter
::Two
=> Some(LevelFilter
::DEBUG
),
131 let (filter
, handle
) = Layer
::new(Filter
::One
);
133 let dispatcher
= tracing_core
::Dispatch
::new(
134 tracing_subscriber
::registry().with(NopLayer
.with_filter(filter
)),
137 tracing_core
::dispatcher
::with_default(&dispatcher
, || {
138 assert_eq
!(FILTER1_CALLS
.load(Ordering
::SeqCst
), 0);
139 assert_eq
!(FILTER2_CALLS
.load(Ordering
::SeqCst
), 0);
143 assert_eq
!(FILTER1_CALLS
.load(Ordering
::SeqCst
), 1);
144 assert_eq
!(FILTER2_CALLS
.load(Ordering
::SeqCst
), 0);
146 assert_eq
!(LevelFilter
::current(), LevelFilter
::INFO
);
147 handle
.reload(Filter
::Two
).expect("should reload");
148 assert_eq
!(LevelFilter
::current(), LevelFilter
::DEBUG
);
152 assert_eq
!(FILTER1_CALLS
.load(Ordering
::SeqCst
), 1);
153 assert_eq
!(FILTER2_CALLS
.load(Ordering
::SeqCst
), 1);