@@ -41,6 +41,9 @@ pub struct EventsFormatter {
41
41
pub ( crate ) with_span_path : bool ,
42
42
pub ( crate ) with_location : bool ,
43
43
pub ( crate ) with_module_path : bool ,
44
+ pub ( crate ) with_timestamp : bool ,
45
+ #[ cfg( feature = "ansi_logs" ) ]
46
+ pub ( crate ) with_ansi_color : bool ,
44
47
}
45
48
46
49
impl Default for EventsFormatter {
@@ -52,10 +55,19 @@ impl Default for EventsFormatter {
52
55
with_span_path : true ,
53
56
with_location : false ,
54
57
with_module_path : false ,
58
+ with_timestamp : true ,
59
+ #[ cfg( feature = "ansi_logs" ) ]
60
+ with_ansi_color : default_enable_ansi_color ( ) ,
55
61
}
56
62
}
57
63
}
58
64
65
+ #[ cfg( feature = "ansi_logs" ) ]
66
+ fn default_enable_ansi_color ( ) -> bool {
67
+ use std:: io:: IsTerminal ;
68
+ std:: io:: stdout ( ) . is_terminal ( )
69
+ }
70
+
59
71
impl < S , N > FormatEvent < S , N > for EventsFormatter
60
72
where
61
73
S : Subscriber + for < ' a > LookupSpan < ' a > ,
@@ -67,19 +79,25 @@ where
67
79
mut writer : format:: Writer < ' _ > ,
68
80
event : & Event < ' _ > ,
69
81
) -> fmt:: Result {
70
- let mut serializer = Serializer :: new ( & mut writer) ;
82
+ let mut serializer = Serializer :: new (
83
+ & mut writer,
84
+ #[ cfg( feature = "ansi_logs" ) ]
85
+ self . with_ansi_color ,
86
+ ) ;
71
87
72
88
let mut visit = || {
73
89
let metadata = event. metadata ( ) ;
74
90
75
- serializer. serialize_key ( "ts" ) ?;
76
- serializer. writer . write_char ( '=' ) ?;
77
- time:: OffsetDateTime :: now_utc ( )
78
- . format_into (
79
- & mut serializer,
80
- & time:: format_description:: well_known:: Rfc3339 ,
81
- )
82
- . map_err ( |_e| fmt:: Error ) ?;
91
+ if self . with_timestamp {
92
+ serializer. serialize_key ( "ts" ) ?;
93
+ serializer. writer . write_char ( '=' ) ?;
94
+ time:: OffsetDateTime :: now_utc ( )
95
+ . format_into (
96
+ & mut serializer,
97
+ & time:: format_description:: well_known:: Rfc3339 ,
98
+ )
99
+ . map_err ( |_e| fmt:: Error ) ?;
100
+ }
83
101
84
102
if self . with_level {
85
103
let level = match * metadata. level ( ) {
@@ -92,17 +110,21 @@ where
92
110
93
111
#[ cfg( feature = "ansi_logs" ) ]
94
112
{
95
- let level_str = match * metadata. level ( ) {
96
- tracing:: Level :: ERROR => nu_ansi_term:: Color :: Red ,
97
- tracing:: Level :: WARN => nu_ansi_term:: Color :: Yellow ,
98
- tracing:: Level :: INFO => nu_ansi_term:: Color :: Green ,
99
- tracing:: Level :: DEBUG => nu_ansi_term:: Color :: Blue ,
100
- tracing:: Level :: TRACE => nu_ansi_term:: Color :: Purple ,
101
- }
102
- . bold ( )
103
- . paint ( level) ;
113
+ if self . with_ansi_color {
114
+ let level_str = match * metadata. level ( ) {
115
+ tracing:: Level :: ERROR => nu_ansi_term:: Color :: Red ,
116
+ tracing:: Level :: WARN => nu_ansi_term:: Color :: Yellow ,
117
+ tracing:: Level :: INFO => nu_ansi_term:: Color :: Green ,
118
+ tracing:: Level :: DEBUG => nu_ansi_term:: Color :: Blue ,
119
+ tracing:: Level :: TRACE => nu_ansi_term:: Color :: Purple ,
120
+ }
121
+ . bold ( )
122
+ . paint ( level) ;
104
123
105
- serializer. serialize_entry ( "level" , & level_str. to_string ( ) ) ?;
124
+ serializer. serialize_entry ( "level" , & level_str. to_string ( ) ) ?;
125
+ } else {
126
+ serializer. serialize_entry ( "level" , level) ?;
127
+ }
106
128
}
107
129
108
130
#[ cfg( not( feature = "ansi_logs" ) ) ]
@@ -160,7 +182,11 @@ where
160
182
}
161
183
162
184
let mut span_path = String :: with_capacity ( required_capacity) ;
163
- let s = Serializer :: new ( & mut span_path) ;
185
+ let s = Serializer :: new (
186
+ & mut span_path,
187
+ #[ cfg( feature = "ansi_logs" ) ]
188
+ self . with_ansi_color ,
189
+ ) ;
164
190
let mut insert_sep = false ;
165
191
for span in span. scope ( ) . from_root ( ) {
166
192
if insert_sep {
@@ -222,7 +248,11 @@ impl<'writer> FormatFields<'writer> for FieldsFormatter {
222
248
mut writer : format:: Writer < ' writer > ,
223
249
fields : R ,
224
250
) -> fmt:: Result {
225
- let mut serializer = Serializer :: new ( & mut writer) ;
251
+ let mut serializer = Serializer :: new (
252
+ & mut writer,
253
+ #[ cfg( feature = "ansi_logs" ) ]
254
+ false ,
255
+ ) ;
226
256
let mut visitor = Visitor :: new ( & mut serializer) ;
227
257
fields. record ( & mut visitor) ;
228
258
Ok ( ( ) )
@@ -452,6 +482,33 @@ mod tests {
452
482
assert ! ( content. contains( "ts=20" ) ) ;
453
483
}
454
484
485
+ #[ test]
486
+ #[ cfg( feature = "ansi_logs" ) ]
487
+ fn test_disable_ansi_color ( ) {
488
+ use tracing:: subscriber;
489
+
490
+ let mock_writer = MockMakeWriter :: new ( ) ;
491
+ let subscriber = builder:: builder ( )
492
+ // disable timestamp so it can be asserted
493
+ . with_timestamp ( false )
494
+ . with_ansi_color ( false )
495
+ . subscriber_builder ( )
496
+ . with_writer ( mock_writer. clone ( ) )
497
+ . finish ( ) ;
498
+
499
+ subscriber:: with_default ( subscriber, || {
500
+ tracing:: info!( "message" ) ;
501
+ } ) ;
502
+
503
+ let content = mock_writer. get_content ( ) ;
504
+
505
+ // assert that there is no ansi color sequences
506
+ assert_eq ! (
507
+ content,
508
+ "level=info target=tracing_logfmt::formatter::tests message=message\n "
509
+ ) ;
510
+ }
511
+
455
512
#[ test]
456
513
#[ cfg( feature = "ansi_logs" ) ]
457
514
fn test_span_and_span_path_with_quoting ( ) {
0 commit comments