6
6
//!
7
7
//! To get started, see [`Tracing`].
8
8
9
- use std:: path:: PathBuf ;
9
+ use std:: { ops :: Not , path:: PathBuf } ;
10
10
11
11
#[ cfg_attr( feature = "clap" , cfg( doc) ) ]
12
12
use clap;
@@ -105,6 +105,7 @@ pub enum Error {
105
105
/// async fn main() -> Result<(), Error> {
106
106
/// let options = TelemetryOptions {
107
107
/// console_log_disabled: false,
108
+ /// console_log_format: Default::default(),
108
109
/// file_log_directory: None,
109
110
/// file_log_rotation_period: None,
110
111
/// file_log_max_files: Some(6),
@@ -347,6 +348,7 @@ impl Tracing {
347
348
pub fn pre_configured ( service_name : & ' static str , options : TelemetryOptions ) -> Self {
348
349
let TelemetryOptions {
349
350
console_log_disabled,
351
+ console_log_format,
350
352
file_log_directory,
351
353
file_log_rotation_period,
352
354
file_log_max_files,
@@ -358,11 +360,14 @@ impl Tracing {
358
360
359
361
Self :: builder ( )
360
362
. service_name ( service_name)
361
- . with_console_output ( (
362
- Self :: CONSOLE_LOG_LEVEL_ENV ,
363
- LevelFilter :: INFO ,
364
- !console_log_disabled,
365
- ) )
363
+ . with_console_output ( console_log_disabled. not ( ) . then ( || {
364
+ Settings :: builder ( )
365
+ . with_environment_variable ( Self :: CONSOLE_LOG_LEVEL_ENV )
366
+ . with_default_level ( LevelFilter :: INFO )
367
+ . console_log_settings_builder ( )
368
+ . with_log_format ( console_log_format)
369
+ . build ( )
370
+ } ) )
366
371
. with_file_output ( file_log_directory. map ( |log_directory| {
367
372
Settings :: builder ( )
368
373
. with_environment_variable ( Self :: FILE_LOG_LEVEL_ENV )
@@ -397,16 +402,29 @@ impl Tracing {
397
402
398
403
if let ConsoleLogSettings :: Enabled {
399
404
common_settings,
400
- log_format : _ ,
405
+ log_format,
401
406
} = & self . console_log_settings
402
407
{
403
408
let env_filter_layer = env_filter_builder (
404
409
common_settings. environment_variable ,
405
410
common_settings. default_level ,
406
411
) ;
407
- let console_output_layer =
408
- tracing_subscriber:: fmt:: layer ( ) . with_filter ( env_filter_layer) ;
409
- layers. push ( console_output_layer. boxed ( ) ) ;
412
+
413
+ // NOTE (@NickLarsenNZ): There is no elegant way to build the layer depending on formats because the types
414
+ // returned from each subscriber "modifier" function is different (sometimes with different generics).
415
+ match log_format {
416
+ Format :: Plain => {
417
+ let console_output_layer =
418
+ tracing_subscriber:: fmt:: layer ( ) . with_filter ( env_filter_layer) ;
419
+ layers. push ( console_output_layer. boxed ( ) ) ;
420
+ }
421
+ Format :: Json => {
422
+ let console_output_layer = tracing_subscriber:: fmt:: layer ( )
423
+ . json ( )
424
+ . with_filter ( env_filter_layer) ;
425
+ layers. push ( console_output_layer. boxed ( ) ) ;
426
+ }
427
+ } ;
410
428
}
411
429
412
430
if let FileLogSettings :: Enabled {
@@ -761,9 +779,16 @@ struct Cli {
761
779
#[ derive( Debug , Default ) ]
762
780
pub struct TelemetryOptions {
763
781
/// Disable console logs.
764
- #[ cfg_attr( feature = "clap" , arg( long, env) ) ]
782
+ #[ cfg_attr( feature = "clap" , arg( long, env, group = "console_log" ) ) ]
765
783
pub console_log_disabled : bool ,
766
784
785
+ /// Console log format.
786
+ #[ cfg_attr(
787
+ feature = "clap" ,
788
+ arg( long, env, group = "console_log" , default_value_t)
789
+ ) ]
790
+ pub console_log_format : Format ,
791
+
767
792
/// Enable logging to files located in the specified DIRECTORY.
768
793
#[ cfg_attr(
769
794
feature = "clap" ,
@@ -1023,6 +1048,7 @@ mod test {
1023
1048
fn pre_configured ( ) {
1024
1049
let tracing = Tracing :: pre_configured ( "test" , TelemetryOptions {
1025
1050
console_log_disabled : false ,
1051
+ console_log_format : Default :: default ( ) ,
1026
1052
file_log_directory : None ,
1027
1053
file_log_rotation_period : None ,
1028
1054
file_log_max_files : None ,
0 commit comments