@@ -19,8 +19,8 @@ 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
24
Structured ,
25
25
}
26
26
@@ -104,15 +104,15 @@ impl GlibLogger {
104
104
Self { format, domain }
105
105
}
106
106
107
- fn level_to_glib ( level : rs_log:: Level ) -> crate :: ffi :: GLogLevelFlags {
107
+ fn level_to_glib ( level : rs_log:: Level ) -> crate :: LogLevel {
108
108
match level {
109
109
// 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 ,
110
+ rs_log:: Level :: Error => crate :: LogLevel :: Critical ,
111
+ rs_log:: Level :: Warn => crate :: LogLevel :: Warning ,
112
+ rs_log:: Level :: Info => crate :: LogLevel :: Info ,
113
+ rs_log:: Level :: Debug => crate :: LogLevel :: Debug ,
114
114
// There is no equivalent to trace level in glib
115
- rs_log:: Level :: Trace => crate :: ffi :: G_LOG_LEVEL_DEBUG ,
115
+ rs_log:: Level :: Trace => crate :: LogLevel :: Debug ,
116
116
}
117
117
}
118
118
@@ -121,16 +121,14 @@ impl GlibLogger {
121
121
unsafe {
122
122
crate :: ffi:: g_log (
123
123
domain. to_glib_none ( ) . 0 ,
124
- GlibLogger :: level_to_glib ( level) ,
124
+ GlibLogger :: level_to_glib ( level) . into_glib ( ) ,
125
125
b"%s\0 " . as_ptr ( ) as * const _ ,
126
126
ToGlibPtr :: < * const std:: os:: raw:: c_char > :: to_glib_none ( message) . 0 ,
127
127
) ;
128
128
}
129
129
}
130
130
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" ) ]
131
+ #[ cfg( feature = "v2_50" ) ]
134
132
fn write_log_structured (
135
133
domain : Option < & str > ,
136
134
level : rs_log:: Level ,
@@ -139,24 +137,19 @@ impl GlibLogger {
139
137
func : Option < & str > ,
140
138
message : & str ,
141
139
) {
142
- let line_str = line. map ( |l| l. to_string ( ) ) ;
140
+ let line = line. map ( |l| l. to_string ( ) ) ;
141
+ let line = line. as_ref ( ) . map ( |s| s. as_str ( ) ) ;
143
142
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
- }
143
+ crate :: log_structured!(
144
+ domain. unwrap_or( "default" ) ,
145
+ GlibLogger :: level_to_glib( level) ,
146
+ {
147
+ "CODE_FILE" => file. unwrap_or( "<unknown file>" ) ;
148
+ "CODE_LINE" => line. unwrap_or( "<unknown line>" ) ;
149
+ "CODE_FUNC" => func. unwrap_or( "<unknown module path>" ) ;
150
+ "MESSAGE" => message;
151
+ }
152
+ ) ;
160
153
}
161
154
}
162
155
@@ -178,28 +171,55 @@ impl rs_log::Log for GlibLogger {
178
171
179
172
match self . format {
180
173
GlibLoggerFormat :: Plain => {
181
- let s = format ! ( "{}" , record. args( ) ) ;
182
- GlibLogger :: write_log ( domain, record. level ( ) , & s)
174
+ let args = record. args ( ) ;
175
+ if let Some ( s) = args. as_str ( ) {
176
+ GlibLogger :: write_log ( domain, record. level ( ) , s) ;
177
+ } else {
178
+ GlibLogger :: write_log ( domain, record. level ( ) , & args. to_string ( ) ) ;
179
+ }
183
180
}
184
181
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( ) ) ,
182
+ match ( record. file ( ) , record. line ( ) ) {
183
+ ( Some ( file) , Some ( line) ) => {
184
+ let s = format ! ( "{}:{}: {}" , file, line, record. args( ) ) ;
185
+ GlibLogger :: write_log ( domain, record. level ( ) , & s) ;
186
+ }
187
+ ( Some ( file) , None ) => {
188
+ let s = format ! ( "{}: {}" , file, record. args( ) ) ;
189
+ GlibLogger :: write_log ( domain, record. level ( ) , & s) ;
190
+ }
191
+ _ => {
192
+ let args = record. args ( ) ;
193
+ if let Some ( s) = args. as_str ( ) {
194
+ GlibLogger :: write_log ( domain, record. level ( ) , s) ;
195
+ } else {
196
+ GlibLogger :: write_log ( domain, record. level ( ) , & args. to_string ( ) ) ;
197
+ }
198
+ }
189
199
} ;
190
-
191
- GlibLogger :: write_log ( domain, record. level ( ) , & s) ;
192
200
}
193
- #[ cfg( any ( feature = "v2_56" , feature = "dox" ) ) ]
201
+ #[ cfg( feature = "v2_50" ) ]
194
202
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
- ) ;
203
+ let args = record. args ( ) ;
204
+ if let Some ( s) = args. as_str ( ) {
205
+ GlibLogger :: write_log_structured (
206
+ domain,
207
+ record. level ( ) ,
208
+ record. file ( ) ,
209
+ record. line ( ) ,
210
+ record. module_path ( ) ,
211
+ s,
212
+ ) ;
213
+ } else {
214
+ GlibLogger :: write_log_structured (
215
+ domain,
216
+ record. level ( ) ,
217
+ record. file ( ) ,
218
+ record. line ( ) ,
219
+ record. module_path ( ) ,
220
+ & args. to_string ( ) ,
221
+ ) ;
222
+ }
203
223
}
204
224
} ;
205
225
}
0 commit comments