@@ -160,31 +160,8 @@ fn text_layers(
160
160
let ( file_layer, reload_handle) = config
161
161
. write_to_files
162
162
. map ( |c| {
163
- let mut builder = RollingFileAppender :: builder ( )
164
- . rotation ( Rotation :: HOURLY )
165
- . filename_prefix ( & c. file_prefix ) ;
166
-
167
- if let Some ( max_files) = c. max_files {
168
- builder = builder. max_log_files ( max_files as usize )
169
- } ;
170
- if let Some ( file_suffix) = c. file_suffix {
171
- builder = builder. filename_suffix ( file_suffix)
172
- }
173
-
174
- let writer = builder. build ( & c. path ) . expect ( "Failed to create a rolling file appender." ) ;
175
-
176
- let layer = fmt:: layer ( )
177
- . fmt_fields ( FieldsFormatterForFiles :: default ( ) )
178
- . event_format ( EventFormatter :: new ( ) )
179
- // EventFormatter doesn't support ANSI colors anyways, but the
180
- // default field formatter does, which is unhelpful for iOS +
181
- // Android logs, but enabled by default.
182
- . with_ansi ( false )
183
- . with_writer ( writer) ;
184
-
185
- let ( layer, reload_handle) = reload:: Layer :: new ( layer) ;
186
-
187
- ( layer, reload_handle)
163
+ let layer = make_file_layer ( c) ;
164
+ reload:: Layer :: new ( layer)
188
165
} )
189
166
. unzip ( ) ;
190
167
@@ -231,6 +208,38 @@ fn text_layers(
231
208
( layers, reload_handle)
232
209
}
233
210
211
+ fn make_file_layer (
212
+ file_configuration : TracingFileConfiguration ,
213
+ ) -> tracing_subscriber:: fmt:: Layer <
214
+ Layered < EnvFilter , Registry , Registry > ,
215
+ FieldsFormatterForFiles ,
216
+ EventFormatter ,
217
+ RollingFileAppender ,
218
+ > {
219
+ let mut builder = RollingFileAppender :: builder ( )
220
+ . rotation ( Rotation :: HOURLY )
221
+ . filename_prefix ( & file_configuration. file_prefix ) ;
222
+
223
+ if let Some ( max_files) = file_configuration. max_files {
224
+ builder = builder. max_log_files ( max_files as usize )
225
+ }
226
+ if let Some ( file_suffix) = file_configuration. file_suffix {
227
+ builder = builder. filename_suffix ( file_suffix)
228
+ }
229
+
230
+ let writer =
231
+ builder. build ( & file_configuration. path ) . expect ( "Failed to create a rolling file appender." ) ;
232
+
233
+ fmt:: layer ( )
234
+ . fmt_fields ( FieldsFormatterForFiles :: default ( ) )
235
+ . event_format ( EventFormatter :: new ( ) )
236
+ // EventFormatter doesn't support ANSI colors anyways, but the
237
+ // default field formatter does, which is unhelpful for iOS +
238
+ // Android logs, but enabled by default.
239
+ . with_ansi ( false )
240
+ . with_writer ( writer)
241
+ }
242
+
234
243
/// Configuration to save logs to (rotated) log-files.
235
244
#[ derive( uniffi:: Record ) ]
236
245
pub struct TracingFileConfiguration {
@@ -593,6 +602,36 @@ pub fn enable_sentry_logging(enabled: bool) {
593
602
} ;
594
603
}
595
604
605
+ /// Updates the tracing subscriber with a new file writer based on the provided
606
+ /// configuration.
607
+ ///
608
+ /// This method will throw if `init_platform` hasn't been called, or if it was
609
+ /// called with `write_to_files` set to `None`.
610
+ #[ matrix_sdk_ffi_macros:: export]
611
+ pub fn reload_tracing_file_writer (
612
+ configuration : TracingFileConfiguration ,
613
+ ) -> Result < ( ) , ClientError > {
614
+ let Some ( logging_context) = LOGGING . get ( ) else {
615
+ return Err ( ClientError :: Generic {
616
+ msg : "Logging hasn't been initialized yet" . to_owned ( ) ,
617
+ details : None ,
618
+ } ) ;
619
+ } ;
620
+
621
+ let Some ( reload_handle) = logging_context. reload_handle . as_ref ( ) else {
622
+ return Err ( ClientError :: Generic {
623
+ msg : "Logging wasn't initialized with a file config" . to_owned ( ) ,
624
+ details : None ,
625
+ } ) ;
626
+ } ;
627
+
628
+ let layer = make_file_layer ( configuration) ;
629
+ reload_handle. reload ( layer) . map_err ( |error| ClientError :: Generic {
630
+ msg : format ! ( "Failed to reload file config: {error}" ) ,
631
+ details : None ,
632
+ } )
633
+ }
634
+
596
635
#[ cfg( not( target_family = "wasm" ) ) ]
597
636
fn setup_multithreaded_tokio_runtime ( ) {
598
637
async_compat:: set_runtime_builder ( Box :: new ( || {
0 commit comments