@@ -859,36 +859,57 @@ macro_rules! g_printerr {
859
859
/// ```
860
860
#[ macro_export]
861
861
macro_rules! log_structured {
862
- ( $log_domain: expr, $log_level: expr, { $( $key: expr => $format: expr $( , $arg: expr) * $( , ) ?) ;+ $( ; ) ?} $( , ) ?) => {
863
- ( || {
864
- let log_domain = <Option <& str > as std:: convert:: From <_>>:: from( $log_domain) ;
865
- let log_domain_str = log_domain. unwrap_or_default( ) ;
866
- let level: $crate:: LogLevel = $log_level;
867
- let field_count =
868
- <[ ( ) ] >:: len( & [ $( $crate:: log_structured_inner!( @clear $key) ) ,+] )
869
- + log_domain. map( |_| 2usize ) . unwrap_or( 1usize ) ;
870
-
871
- $crate:: log_structured_array(
872
- level,
873
- & [
874
- $crate:: LogField :: new(
875
- $crate:: gstr!( "PRIORITY" ) ,
876
- level. priority( ) . as_bytes( ) ,
877
- ) ,
878
- $(
879
- $crate:: LogField :: new(
880
- $crate:: log_structured_inner!( @key $key) ,
881
- $crate:: log_structured_inner!( @value $format $( , $arg) * ) ,
882
- ) ,
883
- ) +
862
+ ( $log_domain: expr, $log_level: expr, { $( $key: expr => $format: expr $( , $arg: expr) * $( , ) ?) ;+ $( ; ) ?} $( , ) ?) => { {
863
+ let log_domain = <Option <& str > as std:: convert:: From <_>>:: from( $log_domain) ;
864
+ let log_domain_str = log_domain. unwrap_or_default( ) ;
865
+ let level: $crate:: LogLevel = $log_level;
866
+ let field_count =
867
+ <[ ( ) ] >:: len( & [ $( $crate:: log_structured_inner!( @clear $key) ) ,+] )
868
+ + log_domain. map( |_| 2usize ) . unwrap_or( 1usize )
869
+ + 3 ;
870
+
871
+ let mut line = [ 0u8 ; 32 ] ; // 32 decimal digits of line numbers should be enough!
872
+ let line = {
873
+ use std:: io:: Write ;
874
+
875
+ let mut cursor = std:: io:: Cursor :: new( & mut line[ ..] ) ;
876
+ std:: write!( & mut cursor, "{}" , line!( ) ) . unwrap( ) ;
877
+ let pos = cursor. position( ) as usize ;
878
+ & line[ ..pos]
879
+ } ;
880
+
881
+ $crate:: log_structured_array(
882
+ level,
883
+ & [
884
+ $crate:: LogField :: new(
885
+ $crate:: gstr!( "PRIORITY" ) ,
886
+ level. priority( ) . as_bytes( ) ,
887
+ ) ,
888
+ $crate:: LogField :: new(
889
+ $crate:: gstr!( "CODE_FILE" ) ,
890
+ file!( ) . as_bytes( ) ,
891
+ ) ,
892
+ $crate:: LogField :: new(
893
+ $crate:: gstr!( "CODE_LINE" ) ,
894
+ line,
895
+ ) ,
896
+ $crate:: LogField :: new(
897
+ $crate:: gstr!( "CODE_FUNC" ) ,
898
+ $crate:: function_name!( ) . as_bytes( ) ,
899
+ ) ,
900
+ $(
884
901
$crate:: LogField :: new(
885
- $crate:: gstr! ( "GLIB_DOMAIN" ) ,
886
- log_domain_str . as_bytes ( ) ,
902
+ $crate:: log_structured_inner! ( @key $key ) ,
903
+ $crate :: log_structured_inner! ( @value $format $ ( , $arg ) * ) ,
887
904
) ,
888
- ] [ 0 ..field_count] ,
889
- )
890
- } ) ( )
891
- } ;
905
+ ) +
906
+ $crate:: LogField :: new(
907
+ $crate:: gstr!( "GLIB_DOMAIN" ) ,
908
+ log_domain_str. as_bytes( ) ,
909
+ ) ,
910
+ ] [ 0 ..field_count] ,
911
+ )
912
+ } } ;
892
913
}
893
914
894
915
#[ doc( hidden) ]
0 commit comments