@@ -19,8 +19,9 @@ pub enum GlibLoggerFormat {
1919 LineAndFile ,
2020 // rustdoc-stripper-ignore-next
2121 /// A logger using glib structured logging. Structured logging is available
22- /// only on features `v2_56` and later.
23- #[ cfg( any( feature = "v2_56" , feature = "dox" ) ) ]
22+ /// only on features `v2_50` and later.
23+ #[ cfg( any( feature = "v2_50" , feature = "dox" ) ) ]
24+ #[ cfg_attr( feature = "dox" , doc( cfg( feature = "v2_50" ) ) ) ]
2425 Structured ,
2526}
2627
@@ -104,15 +105,15 @@ impl GlibLogger {
104105 Self { format, domain }
105106 }
106107
107- fn level_to_glib ( level : rs_log:: Level ) -> crate :: ffi :: GLogLevelFlags {
108+ fn level_to_glib ( level : rs_log:: Level ) -> crate :: LogLevel {
108109 match level {
109110 // Errors are mapped to critical to avoid automatic termination
110- rs_log:: Level :: Error => crate :: ffi :: G_LOG_LEVEL_CRITICAL ,
111- rs_log:: Level :: Warn => crate :: ffi :: G_LOG_LEVEL_WARNING ,
112- rs_log:: Level :: Info => crate :: ffi :: G_LOG_LEVEL_INFO ,
113- rs_log:: Level :: Debug => crate :: ffi :: G_LOG_LEVEL_DEBUG ,
111+ rs_log:: Level :: Error => crate :: LogLevel :: Critical ,
112+ rs_log:: Level :: Warn => crate :: LogLevel :: Warning ,
113+ rs_log:: Level :: Info => crate :: LogLevel :: Info ,
114+ rs_log:: Level :: Debug => crate :: LogLevel :: Debug ,
114115 // There is no equivalent to trace level in glib
115- rs_log:: Level :: Trace => crate :: ffi :: G_LOG_LEVEL_DEBUG ,
116+ rs_log:: Level :: Trace => crate :: LogLevel :: Debug ,
116117 }
117118 }
118119
@@ -121,16 +122,14 @@ impl GlibLogger {
121122 unsafe {
122123 crate :: ffi:: g_log (
123124 domain. to_glib_none ( ) . 0 ,
124- GlibLogger :: level_to_glib ( level) ,
125+ GlibLogger :: level_to_glib ( level) . into_glib ( ) ,
125126 b"%s\0 " . as_ptr ( ) as * const _ ,
126127 ToGlibPtr :: < * const std:: os:: raw:: c_char > :: to_glib_none ( message) . 0 ,
127128 ) ;
128129 }
129130 }
130131
131- #[ cfg( any( feature = "v2_56" , feature = "dox" ) ) ]
132- #[ cfg_attr( feature = "dox" , doc( cfg( feature = "v2_56" ) ) ) ]
133- #[ doc( alias = "g_log_structured_standard" ) ]
132+ #[ cfg( any( feature = "v2_50" , feature = "dox" ) ) ]
134133 fn write_log_structured (
135134 domain : Option < & str > ,
136135 level : rs_log:: Level ,
@@ -139,24 +138,19 @@ impl GlibLogger {
139138 func : Option < & str > ,
140139 message : & str ,
141140 ) {
142- let line_str = line. map ( |l| l. to_string ( ) ) ;
141+ let line = line. map ( |l| l. to_string ( ) ) ;
142+ let line = line. as_ref ( ) . map ( |s| s. as_str ( ) ) ;
143143
144- let domain = domain. unwrap_or ( "default" ) ;
145- let file = file. unwrap_or ( "<unknown file>" ) ;
146- let line_str = line_str. unwrap_or_else ( || String :: from ( "<unknown line>" ) ) ;
147- let func = func. unwrap_or ( "<unknown module path>" ) ;
148-
149- unsafe {
150- crate :: ffi:: g_log_structured_standard (
151- domain. to_glib_none ( ) . 0 ,
152- GlibLogger :: level_to_glib ( level) ,
153- file. to_glib_none ( ) . 0 ,
154- line_str. to_glib_none ( ) . 0 ,
155- func. to_glib_none ( ) . 0 ,
156- b"%s\0 " . as_ptr ( ) as * const _ ,
157- ToGlibPtr :: < * const std:: os:: raw:: c_char > :: to_glib_none ( message) . 0 ,
158- ) ;
159- }
144+ crate :: log_structured!(
145+ domain. unwrap_or( "default" ) ,
146+ GlibLogger :: level_to_glib( level) ,
147+ {
148+ "CODE_FILE" => file. unwrap_or( "<unknown file>" ) ;
149+ "CODE_LINE" => line. unwrap_or( "<unknown line>" ) ;
150+ "CODE_FUNC" => func. unwrap_or( "<unknown module path>" ) ;
151+ "MESSAGE" => message;
152+ }
153+ ) ;
160154 }
161155}
162156
@@ -178,28 +172,55 @@ impl rs_log::Log for GlibLogger {
178172
179173 match self . format {
180174 GlibLoggerFormat :: Plain => {
181- let s = format ! ( "{}" , record. args( ) ) ;
182- GlibLogger :: write_log ( domain, record. level ( ) , & s)
175+ let args = record. args ( ) ;
176+ if let Some ( s) = args. as_str ( ) {
177+ GlibLogger :: write_log ( domain, record. level ( ) , s) ;
178+ } else {
179+ GlibLogger :: write_log ( domain, record. level ( ) , & args. to_string ( ) ) ;
180+ }
183181 }
184182 GlibLoggerFormat :: LineAndFile => {
185- let s = match ( record. file ( ) , record. line ( ) ) {
186- ( Some ( file) , Some ( line) ) => format ! ( "{}:{}: {}" , file, line, record. args( ) ) ,
187- ( Some ( file) , None ) => format ! ( "{}: {}" , file, record. args( ) ) ,
188- _ => format ! ( "{}" , record. args( ) ) ,
183+ match ( record. file ( ) , record. line ( ) ) {
184+ ( Some ( file) , Some ( line) ) => {
185+ let s = format ! ( "{}:{}: {}" , file, line, record. args( ) ) ;
186+ GlibLogger :: write_log ( domain, record. level ( ) , & s) ;
187+ }
188+ ( Some ( file) , None ) => {
189+ let s = format ! ( "{}: {}" , file, record. args( ) ) ;
190+ GlibLogger :: write_log ( domain, record. level ( ) , & s) ;
191+ }
192+ _ => {
193+ let args = record. args ( ) ;
194+ if let Some ( s) = args. as_str ( ) {
195+ GlibLogger :: write_log ( domain, record. level ( ) , s) ;
196+ } else {
197+ GlibLogger :: write_log ( domain, record. level ( ) , & args. to_string ( ) ) ;
198+ }
199+ }
189200 } ;
190-
191- GlibLogger :: write_log ( domain, record. level ( ) , & s) ;
192201 }
193- #[ cfg( any( feature = "v2_56 " , feature = "dox" ) ) ]
202+ #[ cfg( any( feature = "v2_50 " , feature = "dox" ) ) ]
194203 GlibLoggerFormat :: Structured => {
195- GlibLogger :: write_log_structured (
196- domain,
197- record. level ( ) ,
198- record. file ( ) ,
199- record. line ( ) ,
200- record. module_path ( ) ,
201- & format ! ( "{}" , record. args( ) ) ,
202- ) ;
204+ let args = record. args ( ) ;
205+ if let Some ( s) = args. as_str ( ) {
206+ GlibLogger :: write_log_structured (
207+ domain,
208+ record. level ( ) ,
209+ record. file ( ) ,
210+ record. line ( ) ,
211+ record. module_path ( ) ,
212+ s,
213+ ) ;
214+ } else {
215+ GlibLogger :: write_log_structured (
216+ domain,
217+ record. level ( ) ,
218+ record. file ( ) ,
219+ record. line ( ) ,
220+ record. module_path ( ) ,
221+ & args. to_string ( ) ,
222+ ) ;
223+ }
203224 }
204225 } ;
205226 }
0 commit comments