@@ -80,22 +80,22 @@ impl ConsoleWriter {
80
80
self . with_writer ( |w| {
81
81
let mut buffer = BufWriter :: new ( w) ;
82
82
for span in batch {
83
- let _ = Self :: span_to_writer ( span, & mut buffer) ;
83
+ let _ = Self :: span_to_writer ( self , span, & mut buffer) ;
84
84
}
85
85
} ) ;
86
86
}
87
87
88
88
pub fn write_tracing_event ( & self , event : & tracing:: Event < ' _ > ) {
89
89
self . with_writer ( |w| {
90
90
let mut buffer = BufWriter :: new ( w) ;
91
- let _ = Self :: event_to_writer ( event, & mut buffer) ;
91
+ let _ = Self :: event_to_writer ( self , event, & mut buffer) ;
92
92
} ) ;
93
93
}
94
94
95
95
pub fn write_tracing_opentelemetry_data ( & self , data : & OtelData ) {
96
96
self . with_writer ( |w| {
97
97
let mut buffer = BufWriter :: new ( w) ;
98
- let _ = Self :: otel_data_to_writer ( data, & mut buffer) ;
98
+ let _ = Self :: otel_data_to_writer ( self , data, & mut buffer) ;
99
99
} ) ;
100
100
}
101
101
@@ -107,7 +107,7 @@ impl ConsoleWriter {
107
107
}
108
108
}
109
109
110
- fn span_to_writer < W : io:: Write > ( span : & SpanData , w : & mut W ) -> io:: Result < ( ) > {
110
+ fn span_to_writer < W : io:: Write > ( & self , span : & SpanData , w : & mut W ) -> io:: Result < ( ) > {
111
111
// only print for pending span and logs
112
112
if span. get_span_type ( ) . is_none_or ( |ty| ty == "span" ) {
113
113
return Ok ( ( ) ) ;
@@ -128,6 +128,12 @@ impl ConsoleWriter {
128
128
"logfire.level_num" => {
129
129
if let Value :: I64 ( val) = kv. value {
130
130
level = Some ( val) ;
131
+ if let Some ( level) = level {
132
+ // Filter out span below the minimum log level
133
+ if level < level_to_level_number ( self . options . min_log_level ) {
134
+ return Ok ( ( ) ) ;
135
+ }
136
+ }
131
137
}
132
138
}
133
139
"code.namespace" => target = Some ( kv. value . as_str ( ) ) ,
@@ -183,9 +189,17 @@ impl ConsoleWriter {
183
189
writeln ! ( w)
184
190
}
185
191
186
- fn event_to_writer < W : io:: Write > ( event : & tracing:: Event < ' _ > , w : & mut W ) -> io:: Result < ( ) > {
192
+ fn event_to_writer < W : io:: Write > (
193
+ & self ,
194
+ event : & tracing:: Event < ' _ > ,
195
+ w : & mut W ,
196
+ ) -> io:: Result < ( ) > {
187
197
let timestamp: DateTime < Utc > = Utc :: now ( ) ;
188
198
let level = level_to_level_number ( * event. metadata ( ) . level ( ) ) ;
199
+ // Filter out event below the minimum log level
200
+ if level < level_to_level_number ( self . options . min_log_level ) {
201
+ return Ok ( ( ) ) ;
202
+ }
189
203
let target = event. metadata ( ) . module_path ( ) ;
190
204
191
205
let mut visitor = FieldsVisitor {
@@ -226,6 +240,7 @@ impl ConsoleWriter {
226
240
}
227
241
228
242
fn otel_data_to_writer < W : io:: Write > (
243
+ & self ,
229
244
data : & tracing_opentelemetry:: OtelData ,
230
245
w : & mut W ,
231
246
) -> io:: Result < ( ) > {
@@ -249,6 +264,12 @@ impl ConsoleWriter {
249
264
"logfire.level_num" => {
250
265
if let Value :: I64 ( val) = kv. value {
251
266
level = Some ( val) ;
267
+ if let Some ( level) = level {
268
+ // Filter out data below the minimum log level
269
+ if level < level_to_level_number ( self . options . min_log_level ) {
270
+ return Ok ( ( ) ) ;
271
+ }
272
+ }
252
273
}
253
274
}
254
275
"code.namespace" => target = Some ( kv. value . as_str ( ) ) ,
@@ -346,7 +367,9 @@ mod tests {
346
367
fn test_print_to_console ( ) {
347
368
let output = Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ;
348
369
349
- let console_options = ConsoleOptions :: default ( ) . with_target ( Target :: Pipe ( output. clone ( ) ) ) ;
370
+ let console_options = ConsoleOptions :: default ( )
371
+ . with_target ( Target :: Pipe ( output. clone ( ) ) )
372
+ . with_min_log_level ( Level :: TRACE ) ;
350
373
351
374
let handler = crate :: configure ( )
352
375
. local ( )
@@ -386,4 +409,49 @@ mod tests {
386
409
[2m1970-01-01T00:00:00.000005Z[0m[31m ERROR[0m [2;3mlogfire[0m [1mpanic: oh no![0m [3mlocation[0m=src/internal/exporters/console.rs:369:17, [3mbacktrace[0m=disabled backtrace
387
410
"# ) ;
388
411
}
412
+
413
+ #[ test]
414
+ fn test_print_to_console_with_min_log_level ( ) {
415
+ let output = Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ;
416
+
417
+ let console_options = ConsoleOptions :: default ( )
418
+ . with_target ( Target :: Pipe ( output. clone ( ) ) )
419
+ . with_min_log_level ( Level :: INFO ) ;
420
+
421
+ let handler = crate :: configure ( )
422
+ . local ( )
423
+ . send_to_logfire ( false )
424
+ . with_console ( Some ( console_options) )
425
+ . install_panic_handler ( )
426
+ . with_default_level_filter ( LevelFilter :: TRACE )
427
+ . finish ( )
428
+ . unwrap ( ) ;
429
+
430
+ let guard = set_local_logfire ( handler) ;
431
+
432
+ std:: panic:: catch_unwind ( std:: panic:: AssertUnwindSafe ( || {
433
+ tracing:: subscriber:: with_default ( guard. subscriber ( ) . clone ( ) , || {
434
+ let root = crate :: span!( "root span" ) . entered ( ) ;
435
+ let _ = crate :: span!( "hello world span" ) . entered ( ) ;
436
+ let _ = crate :: span!( level: Level :: DEBUG , "debug span" ) ;
437
+ let _ = crate :: span!( parent: & root, level: Level :: DEBUG , "debug span with explicit parent" ) ;
438
+ crate :: info!( "hello world log" ) ;
439
+ panic ! ( "oh no!" ) ;
440
+ } ) ;
441
+ } ) )
442
+ . unwrap_err ( ) ;
443
+
444
+ guard. shutdown_handler . shutdown ( ) . unwrap ( ) ;
445
+
446
+ let output = output. lock ( ) . unwrap ( ) ;
447
+ let output = std:: str:: from_utf8 ( & output) . unwrap ( ) ;
448
+ let output = remap_timestamps_in_console_output ( output) ;
449
+
450
+ assert_snapshot ! ( output, @r#"
451
+ [2m1970-01-01T00:00:00.000000Z[0m[32m INFO[0m [2;3mlogfire::internal::exporters::console::tests[0m [1mroot span[0m
452
+ [2m1970-01-01T00:00:00.000001Z[0m[32m INFO[0m [2;3mlogfire::internal::exporters::console::tests[0m [1mhello world span[0m
453
+ [2m1970-01-01T00:00:00.000004Z[0m[32m INFO[0m [2;3mlogfire::internal::exporters::console::tests[0m [1mhello world log[0m
454
+ [2m1970-01-01T00:00:00.000005Z[0m[31m ERROR[0m [2;3mlogfire[0m [1mpanic: oh no![0m [3mlocation[0m=src/internal/exporters/console.rs:369:17, [3mbacktrace[0m=disabled backtrace
455
+ "# ) ;
456
+ }
389
457
}
0 commit comments