1 #![cfg(feature = "env-filter")]
3 #[path = "../support.rs"]
9 use tracing
::{self, subscriber::with_default, Level}
;
10 use tracing_subscriber
::{
11 filter
::{EnvFilter, LevelFilter}
,
16 fn level_filter_event() {
17 let filter
: EnvFilter
= "info".parse().expect("filter should parse");
18 let (subscriber
, finished
) = subscriber
::mock()
19 .event(event
::mock().at_level(Level
::INFO
))
20 .event(event
::mock().at_level(Level
::WARN
))
21 .event(event
::mock().at_level(Level
::ERROR
))
24 let subscriber
= subscriber
.with(filter
);
26 with_default(subscriber
, || {
27 tracing
::trace
!("this should be disabled");
28 tracing
::info
!("this shouldn't be");
29 tracing
::debug
!(target
: "foo", "this should also be disabled");
30 tracing
::warn
!(target
: "foo", "this should be enabled");
31 tracing
::error
!("this should be enabled too");
34 finished
.assert_finished();
38 fn same_name_spans() {
39 let filter
: EnvFilter
= "[foo{bar}]=trace,[foo{baz}]=trace"
41 .expect("filter should parse");
42 let (subscriber
, finished
) = subscriber
::mock()
46 .at_level(Level
::TRACE
)
47 .with_field(field
::mock("bar")),
52 .at_level(Level
::TRACE
)
53 .with_field(field
::mock("baz")),
57 let subscriber
= subscriber
.with(filter
);
58 with_default(subscriber
, || {
59 tracing
::trace_span
!("foo", bar
= 1);
60 tracing
::trace_span
!("foo", baz
= 1);
63 finished
.assert_finished();
67 fn level_filter_event_with_target() {
68 let filter
: EnvFilter
= "info,stuff=debug".parse().expect("filter should parse");
69 let (subscriber
, finished
) = subscriber
::mock()
70 .event(event
::mock().at_level(Level
::INFO
))
71 .event(event
::mock().at_level(Level
::DEBUG
).with_target("stuff"))
72 .event(event
::mock().at_level(Level
::WARN
).with_target("stuff"))
73 .event(event
::mock().at_level(Level
::ERROR
))
74 .event(event
::mock().at_level(Level
::ERROR
).with_target("stuff"))
77 let subscriber
= subscriber
.with(filter
);
79 with_default(subscriber
, || {
80 tracing
::trace
!("this should be disabled");
81 tracing
::info
!("this shouldn't be");
82 tracing
::debug
!(target
: "stuff", "this should be enabled");
83 tracing
::debug
!("but this shouldn't");
84 tracing
::trace
!(target
: "stuff", "and neither should this");
85 tracing
::warn
!(target
: "stuff", "this should be enabled");
86 tracing
::error
!("this should be enabled too");
87 tracing
::error
!(target
: "stuff", "this should be enabled also");
90 finished
.assert_finished();
94 fn level_filter_event_with_target_and_span_global() {
95 let filter
: EnvFilter
= "info,stuff[cool_span]=debug"
97 .expect("filter should parse");
99 let cool_span
= span
::named("cool_span");
100 let uncool_span
= span
::named("uncool_span");
101 let (subscriber
, handle
) = subscriber
::mock()
102 .enter(cool_span
.clone())
105 .at_level(Level
::DEBUG
)
106 .in_scope(vec
![cool_span
.clone()]),
109 .enter(uncool_span
.clone())
114 let subscriber
= subscriber
.with(filter
);
116 with_default(subscriber
, || {
118 let _span
= tracing
::info_span
!(target
: "stuff", "cool_span").entered();
119 tracing
::debug
!("this should be enabled");
122 tracing
::debug
!("should also be disabled");
125 let _span
= tracing
::info_span
!("uncool_span").entered();
126 tracing
::debug
!("this should be disabled");
130 handle
.assert_finished();
134 fn not_order_dependent() {
135 // this test reproduces tokio-rs/tracing#623
137 let filter
: EnvFilter
= "stuff=debug,info".parse().expect("filter should parse");
138 let (subscriber
, finished
) = subscriber
::mock()
139 .event(event
::mock().at_level(Level
::INFO
))
140 .event(event
::mock().at_level(Level
::DEBUG
).with_target("stuff"))
141 .event(event
::mock().at_level(Level
::WARN
).with_target("stuff"))
142 .event(event
::mock().at_level(Level
::ERROR
))
143 .event(event
::mock().at_level(Level
::ERROR
).with_target("stuff"))
146 let subscriber
= subscriber
.with(filter
);
148 with_default(subscriber
, || {
149 tracing
::trace
!("this should be disabled");
150 tracing
::info
!("this shouldn't be");
151 tracing
::debug
!(target
: "stuff", "this should be enabled");
152 tracing
::debug
!("but this shouldn't");
153 tracing
::trace
!(target
: "stuff", "and neither should this");
154 tracing
::warn
!(target
: "stuff", "this should be enabled");
155 tracing
::error
!("this should be enabled too");
156 tracing
::error
!(target
: "stuff", "this should be enabled also");
159 finished
.assert_finished();
163 fn add_directive_enables_event() {
164 // this test reproduces tokio-rs/tracing#591
166 // by default, use info level
167 let mut filter
= EnvFilter
::new(LevelFilter
::INFO
.to_string());
169 // overwrite with a more specific directive
170 filter
= filter
.add_directive("hello=trace".parse().expect("directive should parse"));
172 let (subscriber
, finished
) = subscriber
::mock()
173 .event(event
::mock().at_level(Level
::INFO
).with_target("hello"))
174 .event(event
::mock().at_level(Level
::TRACE
).with_target("hello"))
177 let subscriber
= subscriber
.with(filter
);
179 with_default(subscriber
, || {
180 tracing
::info
!(target
: "hello", "hello info");
181 tracing
::trace
!(target
: "hello", "hello trace");
184 finished
.assert_finished();
188 fn span_name_filter_is_dynamic() {
189 let filter
: EnvFilter
= "info,[cool_span]=debug"
191 .expect("filter should parse");
192 let (subscriber
, finished
) = subscriber
::mock()
193 .event(event
::mock().at_level(Level
::INFO
))
194 .enter(span
::named("cool_span"))
195 .event(event
::mock().at_level(Level
::DEBUG
))
196 .enter(span
::named("uncool_span"))
197 .event(event
::mock().at_level(Level
::WARN
))
198 .event(event
::mock().at_level(Level
::DEBUG
))
199 .exit(span
::named("uncool_span"))
200 .exit(span
::named("cool_span"))
201 .enter(span
::named("uncool_span"))
202 .event(event
::mock().at_level(Level
::WARN
))
203 .event(event
::mock().at_level(Level
::ERROR
))
204 .exit(span
::named("uncool_span"))
207 let subscriber
= subscriber
.with(filter
);
209 with_default(subscriber
, || {
210 tracing
::trace
!("this should be disabled");
211 tracing
::info
!("this shouldn't be");
212 let cool_span
= tracing
::info_span
!("cool_span");
213 let uncool_span
= tracing
::info_span
!("uncool_span");
216 let _enter
= cool_span
.enter();
217 tracing
::debug
!("i'm a cool event");
218 tracing
::trace
!("i'm cool, but not cool enough");
219 let _enter2
= uncool_span
.enter();
220 tracing
::warn
!("warning: extremely cool!");
221 tracing
::debug
!("i'm still cool");
224 let _enter
= uncool_span
.enter();
225 tracing
::warn
!("warning: not that cool");
226 tracing
::trace
!("im not cool enough");
227 tracing
::error
!("uncool error");
230 finished
.assert_finished();
234 fn method_name_resolution() {
235 #[allow(unused_imports)]
236 use tracing_subscriber
::layer
::{Filter, Layer}
;
238 let filter
= EnvFilter
::new("hello_world=info");
239 filter
.max_level_hint();
242 // contains the same tests as the first half of this file
243 // but using EnvFilter as a `Filter`, not as a `Layer`
244 mod per_layer_filter
{
248 fn level_filter_event() {
249 let filter
: EnvFilter
= "info".parse().expect("filter should parse");
250 let (layer
, handle
) = layer
::mock()
251 .event(event
::mock().at_level(Level
::INFO
))
252 .event(event
::mock().at_level(Level
::WARN
))
253 .event(event
::mock().at_level(Level
::ERROR
))
257 let _subscriber
= tracing_subscriber
::registry()
258 .with(layer
.with_filter(filter
))
261 tracing
::trace
!("this should be disabled");
262 tracing
::info
!("this shouldn't be");
263 tracing
::debug
!(target
: "foo", "this should also be disabled");
264 tracing
::warn
!(target
: "foo", "this should be enabled");
265 tracing
::error
!("this should be enabled too");
267 handle
.assert_finished();
271 fn same_name_spans() {
272 let filter
: EnvFilter
= "[foo{bar}]=trace,[foo{baz}]=trace"
274 .expect("filter should parse");
275 let (layer
, handle
) = layer
::mock()
279 .at_level(Level
::TRACE
)
280 .with_field(field
::mock("bar")),
285 .at_level(Level
::TRACE
)
286 .with_field(field
::mock("baz")),
291 let _subscriber
= tracing_subscriber
::registry()
292 .with(layer
.with_filter(filter
))
295 tracing
::trace_span
!("foo", bar
= 1);
296 tracing
::trace_span
!("foo", baz
= 1);
298 handle
.assert_finished();
302 fn level_filter_event_with_target() {
303 let filter
: EnvFilter
= "info,stuff=debug".parse().expect("filter should parse");
304 let (layer
, handle
) = layer
::mock()
305 .event(event
::mock().at_level(Level
::INFO
))
306 .event(event
::mock().at_level(Level
::DEBUG
).with_target("stuff"))
307 .event(event
::mock().at_level(Level
::WARN
).with_target("stuff"))
308 .event(event
::mock().at_level(Level
::ERROR
))
309 .event(event
::mock().at_level(Level
::ERROR
).with_target("stuff"))
313 let _subscriber
= tracing_subscriber
::registry()
314 .with(layer
.with_filter(filter
))
317 tracing
::trace
!("this should be disabled");
318 tracing
::info
!("this shouldn't be");
319 tracing
::debug
!(target
: "stuff", "this should be enabled");
320 tracing
::debug
!("but this shouldn't");
321 tracing
::trace
!(target
: "stuff", "and neither should this");
322 tracing
::warn
!(target
: "stuff", "this should be enabled");
323 tracing
::error
!("this should be enabled too");
324 tracing
::error
!(target
: "stuff", "this should be enabled also");
326 handle
.assert_finished();
330 fn level_filter_event_with_target_and_span() {
331 let filter
: EnvFilter
= "stuff[cool_span]=debug"
333 .expect("filter should parse");
335 let cool_span
= span
::named("cool_span");
336 let (layer
, handle
) = layer
::mock()
337 .enter(cool_span
.clone())
340 .at_level(Level
::DEBUG
)
341 .in_scope(vec
![cool_span
.clone()]),
347 let _subscriber
= tracing_subscriber
::registry()
348 .with(layer
.with_filter(filter
))
352 let _span
= tracing
::info_span
!(target
: "stuff", "cool_span").entered();
353 tracing
::debug
!("this should be enabled");
356 tracing
::debug
!("should also be disabled");
359 let _span
= tracing
::info_span
!("uncool_span").entered();
360 tracing
::debug
!("this should be disabled");
363 handle
.assert_finished();
367 fn not_order_dependent() {
368 // this test reproduces tokio-rs/tracing#623
370 let filter
: EnvFilter
= "stuff=debug,info".parse().expect("filter should parse");
371 let (layer
, finished
) = layer
::mock()
372 .event(event
::mock().at_level(Level
::INFO
))
373 .event(event
::mock().at_level(Level
::DEBUG
).with_target("stuff"))
374 .event(event
::mock().at_level(Level
::WARN
).with_target("stuff"))
375 .event(event
::mock().at_level(Level
::ERROR
))
376 .event(event
::mock().at_level(Level
::ERROR
).with_target("stuff"))
380 let _subscriber
= tracing_subscriber
::registry()
381 .with(layer
.with_filter(filter
))
384 tracing
::trace
!("this should be disabled");
385 tracing
::info
!("this shouldn't be");
386 tracing
::debug
!(target
: "stuff", "this should be enabled");
387 tracing
::debug
!("but this shouldn't");
388 tracing
::trace
!(target
: "stuff", "and neither should this");
389 tracing
::warn
!(target
: "stuff", "this should be enabled");
390 tracing
::error
!("this should be enabled too");
391 tracing
::error
!(target
: "stuff", "this should be enabled also");
393 finished
.assert_finished();
397 fn add_directive_enables_event() {
398 // this test reproduces tokio-rs/tracing#591
400 // by default, use info level
401 let mut filter
= EnvFilter
::new(LevelFilter
::INFO
.to_string());
403 // overwrite with a more specific directive
404 filter
= filter
.add_directive("hello=trace".parse().expect("directive should parse"));
406 let (layer
, finished
) = layer
::mock()
407 .event(event
::mock().at_level(Level
::INFO
).with_target("hello"))
408 .event(event
::mock().at_level(Level
::TRACE
).with_target("hello"))
412 let _subscriber
= tracing_subscriber
::registry()
413 .with(layer
.with_filter(filter
))
416 tracing
::info
!(target
: "hello", "hello info");
417 tracing
::trace
!(target
: "hello", "hello trace");
419 finished
.assert_finished();
423 fn span_name_filter_is_dynamic() {
424 let filter
: EnvFilter
= "info,[cool_span]=debug"
426 .expect("filter should parse");
427 let cool_span
= span
::named("cool_span");
428 let uncool_span
= span
::named("uncool_span");
429 let (layer
, finished
) = layer
::mock()
430 .event(event
::mock().at_level(Level
::INFO
))
431 .enter(cool_span
.clone())
434 .at_level(Level
::DEBUG
)
435 .in_scope(vec
![cool_span
.clone()]),
437 .enter(uncool_span
.clone())
440 .at_level(Level
::WARN
)
441 .in_scope(vec
![uncool_span
.clone()]),
445 .at_level(Level
::DEBUG
)
446 .in_scope(vec
![uncool_span
.clone()]),
448 .exit(uncool_span
.clone())
450 .enter(uncool_span
.clone())
453 .at_level(Level
::WARN
)
454 .in_scope(vec
![uncool_span
.clone()]),
458 .at_level(Level
::ERROR
)
459 .in_scope(vec
![uncool_span
.clone()]),
465 let _subscriber
= tracing_subscriber
::registry()
466 .with(layer
.with_filter(filter
))
469 tracing
::trace
!("this should be disabled");
470 tracing
::info
!("this shouldn't be");
471 let cool_span
= tracing
::info_span
!("cool_span");
472 let uncool_span
= tracing
::info_span
!("uncool_span");
475 let _enter
= cool_span
.enter();
476 tracing
::debug
!("i'm a cool event");
477 tracing
::trace
!("i'm cool, but not cool enough");
478 let _enter2
= uncool_span
.enter();
479 tracing
::warn
!("warning: extremely cool!");
480 tracing
::debug
!("i'm still cool");
484 let _enter
= uncool_span
.enter();
485 tracing
::warn
!("warning: not that cool");
486 tracing
::trace
!("im not cool enough");
487 tracing
::error
!("uncool error");
490 finished
.assert_finished();
494 fn multiple_dynamic_filters() {
495 // Test that multiple dynamic (span) filters only apply to the layers
496 // they're attached to.
497 let (layer1
, handle1
) = {
498 let span
= span
::named("span1");
499 let filter
: EnvFilter
= "[span1]=debug".parse().expect("filter 1 should parse");
500 let (layer
, handle
) = layer
::named("layer1")
504 .at_level(Level
::DEBUG
)
505 .in_scope(vec
![span
.clone()]),
510 (layer
.with_filter(filter
), handle
)
513 let (layer2
, handle2
) = {
514 let span
= span
::named("span2");
515 let filter
: EnvFilter
= "[span2]=info".parse().expect("filter 2 should parse");
516 let (layer
, handle
) = layer
::named("layer2")
520 .at_level(Level
::INFO
)
521 .in_scope(vec
![span
.clone()]),
526 (layer
.with_filter(filter
), handle
)
529 let _subscriber
= tracing_subscriber
::registry()
534 tracing
::info_span
!("span1").in_scope(|| {
535 tracing
::debug
!("hello from span 1");
536 tracing
::trace
!("not enabled");
539 tracing
::info_span
!("span2").in_scope(|| {
540 tracing
::info
!("hello from span 2");
541 tracing
::debug
!("not enabled");
544 handle1
.assert_finished();
545 handle2
.assert_finished();