@@ -70,6 +70,7 @@ pub struct Layer<
70
70
fmt_event : E ,
71
71
fmt_span : format:: FmtSpanConfig ,
72
72
is_ansi : bool ,
73
+ silence_errors : bool ,
73
74
_inner : PhantomData < fn ( S ) > ,
74
75
}
75
76
@@ -119,6 +120,7 @@ where
119
120
fmt_span : self . fmt_span ,
120
121
make_writer : self . make_writer ,
121
122
is_ansi : self . is_ansi ,
123
+ silence_errors : self . silence_errors ,
122
124
_inner : self . _inner ,
123
125
}
124
126
}
@@ -148,6 +150,7 @@ where
148
150
fmt_span : self . fmt_span ,
149
151
make_writer : self . make_writer ,
150
152
is_ansi : self . is_ansi ,
153
+ silence_errors : self . silence_errors ,
151
154
_inner : self . _inner ,
152
155
}
153
156
}
@@ -180,6 +183,7 @@ impl<S, N, E, W> Layer<S, N, E, W> {
180
183
fmt_event : self . fmt_event ,
181
184
fmt_span : self . fmt_span ,
182
185
is_ansi : self . is_ansi ,
186
+ silence_errors : self . silence_errors ,
183
187
make_writer,
184
188
_inner : self . _inner ,
185
189
}
@@ -263,6 +267,7 @@ impl<S, N, E, W> Layer<S, N, E, W> {
263
267
fmt_event : self . fmt_event ,
264
268
fmt_span : self . fmt_span ,
265
269
is_ansi : self . is_ansi ,
270
+ silence_errors : self . silence_errors ,
266
271
make_writer : TestWriter :: default ( ) ,
267
272
_inner : self . _inner ,
268
273
}
@@ -278,6 +283,14 @@ impl<S, N, E, W> Layer<S, N, E, W> {
278
283
}
279
284
}
280
285
286
+ /// Whether to write errors to the Writer, or ignore them.
287
+ pub fn with_silence_errors ( self , silence_errors : bool ) -> Self {
288
+ Self {
289
+ silence_errors,
290
+ ..self
291
+ }
292
+ }
293
+
281
294
/// Updates the [`MakeWriter`] by applying a function to the existing [`MakeWriter`].
282
295
///
283
296
/// This sets the [`MakeWriter`] that the layer being built will use to write events.
@@ -306,6 +319,7 @@ impl<S, N, E, W> Layer<S, N, E, W> {
306
319
fmt_event : self . fmt_event ,
307
320
fmt_span : self . fmt_span ,
308
321
is_ansi : self . is_ansi ,
322
+ silence_errors : self . silence_errors ,
309
323
make_writer : f ( self . make_writer ) ,
310
324
_inner : self . _inner ,
311
325
}
@@ -337,6 +351,7 @@ where
337
351
fmt_span : self . fmt_span ,
338
352
make_writer : self . make_writer ,
339
353
is_ansi : self . is_ansi ,
354
+ silence_errors : self . silence_errors ,
340
355
_inner : self . _inner ,
341
356
}
342
357
}
@@ -349,6 +364,7 @@ where
349
364
fmt_span : self . fmt_span . without_time ( ) ,
350
365
make_writer : self . make_writer ,
351
366
is_ansi : self . is_ansi ,
367
+ silence_errors : self . silence_errors ,
352
368
_inner : self . _inner ,
353
369
}
354
370
}
@@ -477,6 +493,7 @@ where
477
493
fmt_span : self . fmt_span ,
478
494
make_writer : self . make_writer ,
479
495
is_ansi : self . is_ansi ,
496
+ silence_errors : self . silence_errors ,
480
497
_inner : self . _inner ,
481
498
}
482
499
}
@@ -491,6 +508,7 @@ where
491
508
fmt_span : self . fmt_span ,
492
509
make_writer : self . make_writer ,
493
510
is_ansi : self . is_ansi ,
511
+ silence_errors : self . silence_errors ,
494
512
_inner : self . _inner ,
495
513
}
496
514
}
@@ -521,6 +539,7 @@ where
521
539
make_writer : self . make_writer ,
522
540
// always disable ANSI escapes in JSON mode!
523
541
is_ansi : false ,
542
+ silence_errors : self . silence_errors ,
524
543
_inner : self . _inner ,
525
544
}
526
545
}
@@ -587,6 +606,7 @@ impl<S, N, E, W> Layer<S, N, E, W> {
587
606
fmt_span : self . fmt_span ,
588
607
make_writer : self . make_writer ,
589
608
is_ansi : self . is_ansi ,
609
+ silence_errors : self . silence_errors ,
590
610
_inner : self . _inner ,
591
611
}
592
612
}
@@ -617,6 +637,7 @@ impl<S, N, E, W> Layer<S, N, E, W> {
617
637
fmt_span : self . fmt_span ,
618
638
make_writer : self . make_writer ,
619
639
is_ansi : self . is_ansi ,
640
+ silence_errors : self . silence_errors ,
620
641
_inner : self . _inner ,
621
642
}
622
643
}
@@ -630,6 +651,7 @@ impl<S> Default for Layer<S> {
630
651
fmt_span : format:: FmtSpanConfig :: default ( ) ,
631
652
make_writer : io:: stdout,
632
653
is_ansi : cfg ! ( feature = "ansi" ) ,
654
+ silence_errors : false ,
633
655
_inner : PhantomData ,
634
656
}
635
657
}
@@ -749,6 +771,11 @@ where
749
771
{
750
772
fields. was_ansi = self . is_ansi ;
751
773
extensions. insert ( fields) ;
774
+ } else {
775
+ eprintln ! (
776
+ "[tracing-subscriber] Unable to format the following event, ignoring: {:?}" ,
777
+ attrs
778
+ ) ;
752
779
}
753
780
}
754
781
@@ -895,9 +922,20 @@ where
895
922
. is_ok ( )
896
923
{
897
924
let mut writer = self . make_writer . make_writer_for ( event. metadata ( ) ) ;
898
- let _ = io:: Write :: write_all ( & mut writer, buf. as_bytes ( ) ) ;
899
- } else {
900
- eprintln ! ( "[tracing-subscriber] Unable to format the following event: {:?}" , event) ;
925
+ let res = io:: Write :: write_all ( & mut writer, buf. as_bytes ( ) ) ;
926
+ if !self . silence_errors {
927
+ if let Err ( e) = res {
928
+ eprintln ! ( "Unable to write an event to the Writer for this Subscriber! Error: {}\n " , e) ;
929
+ }
930
+ }
931
+ } else if !self . silence_errors {
932
+ let err_msg = format ! ( "Unable to format the following event. Name: {}; Fields: {:?}\n " ,
933
+ event. metadata( ) . name( ) , event. fields( ) ) ;
934
+ let mut writer = self . make_writer . make_writer_for ( event. metadata ( ) ) ;
935
+ let res = io:: Write :: write_all ( & mut writer, err_msg. as_bytes ( ) ) ;
936
+ if let Err ( e) = res {
937
+ eprintln ! ( "Unable to write an \" event formatting error\" to the Writer for this Subscriber! Error: {}\n " , e) ;
938
+ }
901
939
}
902
940
903
941
buf. clear ( ) ;
@@ -1194,6 +1232,60 @@ mod test {
1194
1232
re. replace_all ( s. as_str ( ) , "timing" ) . to_string ( )
1195
1233
}
1196
1234
1235
+ #[ test]
1236
+ fn format_error_print_to_stderr ( ) {
1237
+ struct AlwaysError ;
1238
+
1239
+ impl std:: fmt:: Debug for AlwaysError {
1240
+ fn fmt ( & self , _f : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
1241
+ Err ( std:: fmt:: Error )
1242
+ }
1243
+ }
1244
+
1245
+ let make_writer = MockMakeWriter :: default ( ) ;
1246
+ let subscriber = crate :: fmt:: Subscriber :: builder ( )
1247
+ . with_writer ( make_writer. clone ( ) )
1248
+ . with_level ( false )
1249
+ . with_ansi ( false )
1250
+ . with_timer ( MockTime )
1251
+ . finish ( ) ;
1252
+
1253
+ with_default ( subscriber, || {
1254
+ tracing:: info!( ?AlwaysError ) ;
1255
+ } ) ;
1256
+ let actual = sanitize_timings ( make_writer. get_string ( ) ) ;
1257
+
1258
+ // Only assert the start because the line number and callsite may change.
1259
+ let expected = "Unable to format the following event. Name: event tracing-subscriber/src/fmt/fmt_layer.rs:" ;
1260
+ assert ! ( actual. as_str( ) . starts_with( expected) ) ;
1261
+ }
1262
+
1263
+ #[ test]
1264
+ fn format_error_ignore_if_silence_errors_is_true ( ) {
1265
+ struct AlwaysError ;
1266
+
1267
+ impl std:: fmt:: Debug for AlwaysError {
1268
+ fn fmt ( & self , _f : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
1269
+ Err ( std:: fmt:: Error )
1270
+ }
1271
+ }
1272
+
1273
+ let make_writer = MockMakeWriter :: default ( ) ;
1274
+ let subscriber = crate :: fmt:: Subscriber :: builder ( )
1275
+ . with_writer ( make_writer. clone ( ) )
1276
+ . with_level ( false )
1277
+ . with_ansi ( false )
1278
+ . with_timer ( MockTime )
1279
+ . with_silence_errors ( true )
1280
+ . finish ( ) ;
1281
+
1282
+ with_default ( subscriber, || {
1283
+ tracing:: info!( ?AlwaysError ) ;
1284
+ } ) ;
1285
+ let actual = sanitize_timings ( make_writer. get_string ( ) ) ;
1286
+ assert_eq ! ( "" , actual. as_str( ) ) ;
1287
+ }
1288
+
1197
1289
#[ test]
1198
1290
fn synthesize_span_none ( ) {
1199
1291
let make_writer = MockMakeWriter :: default ( ) ;
0 commit comments