@@ -410,6 +410,9 @@ pub struct Format<F = Full, T = SystemTime> {
410
410
pub ( crate ) display_timestamp : bool ,
411
411
pub ( crate ) display_target : bool ,
412
412
pub ( crate ) display_level : bool ,
413
+ pub ( crate ) display_executable_name : bool ,
414
+ pub ( crate ) executable_name : Option < String > ,
415
+ pub ( crate ) display_process_id : bool ,
413
416
pub ( crate ) display_thread_id : bool ,
414
417
pub ( crate ) display_thread_name : bool ,
415
418
pub ( crate ) display_filename : bool ,
@@ -588,6 +591,9 @@ impl Default for Format<Full, SystemTime> {
588
591
display_timestamp : true ,
589
592
display_target : true ,
590
593
display_level : true ,
594
+ display_executable_name : false ,
595
+ executable_name : None ,
596
+ display_process_id : false ,
591
597
display_thread_id : false ,
592
598
display_thread_name : false ,
593
599
display_filename : false ,
@@ -608,6 +614,9 @@ impl<F, T> Format<F, T> {
608
614
display_target : false ,
609
615
display_timestamp : self . display_timestamp ,
610
616
display_level : self . display_level ,
617
+ display_executable_name : self . display_executable_name ,
618
+ executable_name : self . executable_name ,
619
+ display_process_id : self . display_process_id ,
611
620
display_thread_id : self . display_thread_id ,
612
621
display_thread_name : self . display_thread_name ,
613
622
display_filename : self . display_filename ,
@@ -647,6 +656,9 @@ impl<F, T> Format<F, T> {
647
656
display_target : self . display_target ,
648
657
display_timestamp : self . display_timestamp ,
649
658
display_level : self . display_level ,
659
+ display_executable_name : self . display_executable_name ,
660
+ executable_name : self . executable_name ,
661
+ display_process_id : self . display_process_id ,
650
662
display_thread_id : self . display_thread_id ,
651
663
display_thread_name : self . display_thread_name ,
652
664
display_filename : true ,
@@ -679,6 +691,9 @@ impl<F, T> Format<F, T> {
679
691
display_target : self . display_target ,
680
692
display_timestamp : self . display_timestamp ,
681
693
display_level : self . display_level ,
694
+ display_executable_name : self . display_executable_name ,
695
+ executable_name : self . executable_name ,
696
+ display_process_id : self . display_process_id ,
682
697
display_thread_id : self . display_thread_id ,
683
698
display_thread_name : self . display_thread_name ,
684
699
display_filename : self . display_filename ,
@@ -708,6 +723,9 @@ impl<F, T> Format<F, T> {
708
723
display_target : self . display_target ,
709
724
display_timestamp : self . display_timestamp ,
710
725
display_level : self . display_level ,
726
+ display_executable_name : self . display_executable_name ,
727
+ executable_name : self . executable_name ,
728
+ display_process_id : self . display_process_id ,
711
729
display_thread_id : self . display_thread_id ,
712
730
display_thread_name : self . display_thread_name ,
713
731
display_filename : self . display_filename ,
@@ -724,6 +742,9 @@ impl<F, T> Format<F, T> {
724
742
display_timestamp : false ,
725
743
display_target : self . display_target ,
726
744
display_level : self . display_level ,
745
+ display_executable_name : self . display_executable_name ,
746
+ executable_name : self . executable_name ,
747
+ display_process_id : self . display_process_id ,
727
748
display_thread_id : self . display_thread_id ,
728
749
display_thread_name : self . display_thread_name ,
729
750
display_filename : self . display_filename ,
@@ -755,6 +776,34 @@ impl<F, T> Format<F, T> {
755
776
}
756
777
}
757
778
779
+ /// Sets whether or not the binary name of the process is displayed when
780
+ /// formatting events. If executable_name is None, argv\[0\] will be used,
781
+ /// otherwise the spcified string will be used.
782
+ ///
783
+ /// [argv\[0\]]: std::env::args
784
+ pub fn with_executable_name (
785
+ self ,
786
+ display_executable_name : bool ,
787
+ executable_name : Option < impl Into < String > > ,
788
+ ) -> Format < F , T > {
789
+ Format {
790
+ display_executable_name,
791
+ executable_name : executable_name. map ( Into :: into) ,
792
+ ..self
793
+ }
794
+ }
795
+
796
+ /// Sets whether or not the [process ID] of the current thread is displayed
797
+ /// when formatting events.
798
+ ///
799
+ /// [process ID]: std::process::id
800
+ pub fn with_process_id ( self , display_process_id : bool ) -> Format < F , T > {
801
+ Format {
802
+ display_process_id,
803
+ ..self
804
+ }
805
+ }
806
+
758
807
/// Sets whether or not the [thread ID] of the current thread is displayed
759
808
/// when formatting events.
760
809
///
@@ -940,6 +989,20 @@ where
940
989
self . format_timestamp ( & mut writer) ?;
941
990
self . format_level ( * meta. level ( ) , & mut writer) ?;
942
991
992
+ if self . display_executable_name {
993
+ if let Some ( executable_name) = & self . executable_name {
994
+ write ! ( writer, "{} " , executable_name) ?;
995
+ } else if let Some ( argv0) = std:: env:: args ( ) . next ( ) {
996
+ write ! ( writer, "{} " , argv0) ?;
997
+ } else {
998
+ write ! ( writer, "<missing_argv[0] " ) ?;
999
+ }
1000
+ }
1001
+
1002
+ if self . display_process_id {
1003
+ write ! ( writer, "PID({}) " , std:: process:: id( ) ) ?;
1004
+ }
1005
+
943
1006
if self . display_thread_name {
944
1007
let current_thread = std:: thread:: current ( ) ;
945
1008
match current_thread. name ( ) {
@@ -1067,7 +1130,12 @@ where
1067
1130
1068
1131
let dimmed = writer. dimmed ( ) ;
1069
1132
if self . display_target {
1070
- write ! ( writer, "{}{}" , dimmed. paint( meta. target( ) ) , dimmed. paint( ":" ) ) ?;
1133
+ write ! (
1134
+ writer,
1135
+ "{}{}" ,
1136
+ dimmed. paint( meta. target( ) ) ,
1137
+ dimmed. paint( ":" )
1138
+ ) ?;
1071
1139
}
1072
1140
1073
1141
if self . display_filename {
@@ -1662,6 +1730,8 @@ pub(super) mod test {
1662
1730
. without_time ( )
1663
1731
. with_level ( false )
1664
1732
. with_target ( false )
1733
+ . with_executable_name ( false , None :: < & str > )
1734
+ . with_process_id ( false )
1665
1735
. with_thread_ids ( false )
1666
1736
. with_thread_names ( false ) ;
1667
1737
#[ cfg( feature = "ansi" ) ]
@@ -1777,6 +1847,50 @@ pub(super) mod test {
1777
1847
assert_info_hello ( subscriber, make_writer, expected) ;
1778
1848
}
1779
1849
1850
+ #[ test]
1851
+ fn with_automatic_executable_name ( ) {
1852
+ let make_writer = MockMakeWriter :: default ( ) ;
1853
+ let subscriber = crate :: fmt:: Collector :: builder ( )
1854
+ . with_writer ( make_writer. clone ( ) )
1855
+ . with_executable_name ( true , None :: < & str > )
1856
+ . with_ansi ( false )
1857
+ . with_timer ( MockTime ) ;
1858
+ let expected = format ! (
1859
+ "fake time INFO {} tracing_subscriber::fmt::format::test: hello\n " ,
1860
+ std:: env:: args( ) . next( ) . unwrap( )
1861
+ ) ;
1862
+
1863
+ assert_info_hello ( subscriber, make_writer, & expected) ;
1864
+ }
1865
+
1866
+ #[ test]
1867
+ fn with_manual_executable_name ( ) {
1868
+ let make_writer = MockMakeWriter :: default ( ) ;
1869
+ let subscriber = crate :: fmt:: Collector :: builder ( )
1870
+ . with_writer ( make_writer. clone ( ) )
1871
+ . with_executable_name ( true , Some ( "a_nice_rust_binary" ) )
1872
+ . with_ansi ( false )
1873
+ . with_timer ( MockTime ) ;
1874
+ let expected =
1875
+ "fake time INFO a_nice_rust_binary tracing_subscriber::fmt::format::test: hello\n " ;
1876
+
1877
+ assert_info_hello ( subscriber, make_writer, expected) ;
1878
+ }
1879
+
1880
+ #[ test]
1881
+ fn with_process_id ( ) {
1882
+ let make_writer = MockMakeWriter :: default ( ) ;
1883
+ let subscriber = crate :: fmt:: Collector :: builder ( )
1884
+ . with_writer ( make_writer. clone ( ) )
1885
+ . with_process_id ( true )
1886
+ . with_ansi ( false )
1887
+ . with_timer ( MockTime ) ;
1888
+ let expected =
1889
+ "fake time INFO PID(NUMERIC) tracing_subscriber::fmt::format::test: hello\n " ;
1890
+
1891
+ assert_info_hello_ignore_numeric ( subscriber, make_writer, expected) ;
1892
+ }
1893
+
1780
1894
#[ test]
1781
1895
fn with_thread_ids ( ) {
1782
1896
let make_writer = MockMakeWriter :: default ( ) ;
0 commit comments