@@ -19,8 +19,9 @@ pub enum GlibLoggerFormat {
19
19
LineAndFile ,
20
20
// rustdoc-stripper-ignore-next
21
21
/// 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" ) ) ) ]
24
25
Structured ,
25
26
}
26
27
@@ -104,15 +105,15 @@ impl GlibLogger {
104
105
Self { format, domain }
105
106
}
106
107
107
- fn level_to_glib ( level : rs_log:: Level ) -> crate :: ffi :: GLogLevelFlags {
108
+ fn level_to_glib ( level : rs_log:: Level ) -> crate :: LogLevel {
108
109
match level {
109
110
// 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 ,
114
115
// 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 ,
116
117
}
117
118
}
118
119
@@ -121,16 +122,14 @@ impl GlibLogger {
121
122
unsafe {
122
123
crate :: ffi:: g_log (
123
124
domain. to_glib_none ( ) . 0 ,
124
- GlibLogger :: level_to_glib ( level) ,
125
+ GlibLogger :: level_to_glib ( level) . into_glib ( ) ,
125
126
b"%s\0 " . as_ptr ( ) as * const _ ,
126
127
ToGlibPtr :: < * const std:: os:: raw:: c_char > :: to_glib_none ( message) . 0 ,
127
128
) ;
128
129
}
129
130
}
130
131
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" ) ) ]
134
133
fn write_log_structured (
135
134
domain : Option < & str > ,
136
135
level : rs_log:: Level ,
@@ -139,24 +138,19 @@ impl GlibLogger {
139
138
func : Option < & str > ,
140
139
message : & str ,
141
140
) {
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 ( ) ) ;
143
143
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
+ ) ;
160
154
}
161
155
}
162
156
@@ -178,28 +172,55 @@ impl rs_log::Log for GlibLogger {
178
172
179
173
match self . format {
180
174
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
+ }
183
181
}
184
182
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
+ }
189
200
} ;
190
-
191
- GlibLogger :: write_log ( domain, record. level ( ) , & s) ;
192
201
}
193
- #[ cfg( any( feature = "v2_56 " , feature = "dox" ) ) ]
202
+ #[ cfg( any( feature = "v2_50 " , feature = "dox" ) ) ]
194
203
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
+ }
203
224
}
204
225
} ;
205
226
}
0 commit comments