Skip to content

Commit ae57156

Browse files
pixlwavepoljar
authored andcommitted
ffi: Add reload_tracing_file_writer() to reconfigure the RollingFileAppender.
1 parent 3b09c60 commit ae57156

File tree

1 file changed

+64
-25
lines changed

1 file changed

+64
-25
lines changed

bindings/matrix-sdk-ffi/src/platform.rs

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -160,31 +160,8 @@ fn text_layers(
160160
let (file_layer, reload_handle) = config
161161
.write_to_files
162162
.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)
188165
})
189166
.unzip();
190167

@@ -231,6 +208,38 @@ fn text_layers(
231208
(layers, reload_handle)
232209
}
233210

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+
234243
/// Configuration to save logs to (rotated) log-files.
235244
#[derive(uniffi::Record)]
236245
pub struct TracingFileConfiguration {
@@ -593,6 +602,36 @@ pub fn enable_sentry_logging(enabled: bool) {
593602
};
594603
}
595604

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+
596635
#[cfg(not(target_family = "wasm"))]
597636
fn setup_multithreaded_tokio_runtime() {
598637
async_compat::set_runtime_builder(Box::new(|| {

0 commit comments

Comments
 (0)