atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git
bindings/matrix-sdk-crypto-ffi/src/logger.rsRust63 lines1.7 KB
1
use std::{
2
    io::{Result, Write},
3
    sync::{Arc, Mutex},
4
};
5
6
use tracing_subscriber::{EnvFilter, fmt::MakeWriter};
7
8
/// Trait that can be used to forward Rust logs over FFI to a language specific
9
/// logger.
10
#[matrix_sdk_ffi_macros::export(callback_interface)]
11
pub trait Logger: Send {
12
    /// Called every time the Rust side wants to post a log line.
13
    fn log(&self, log_line: String);
14
    // TODO add support for different log levels, do this by adding more methods
15
    // to the trait.
16
}
17
18
impl Write for LoggerWrapper {
19
    fn write(&mut self, buf: &[u8]) -> Result<usize> {
20
        let data = String::from_utf8_lossy(buf).to_string();
21
        self.inner.lock().unwrap().log(data);
22
23
        Ok(buf.len())
24
    }
25
26
    fn flush(&mut self) -> Result<()> {
27
        Ok(())
28
    }
29
}
30
31
impl MakeWriter<'_> for LoggerWrapper {
32
    type Writer = LoggerWrapper;
33
34
    fn make_writer(&self) -> Self::Writer {
35
        self.clone()
36
    }
37
}
38
39
#[derive(Clone)]
40
pub struct LoggerWrapper {
41
    inner: Arc<Mutex<Box<dyn Logger>>>,
42
}
43
44
/// Set the logger that should be used to forward Rust logs over FFI.
45
#[matrix_sdk_ffi_macros::export]
46
pub fn set_logger(logger: Box<dyn Logger>) {
47
    let logger = LoggerWrapper { inner: Arc::new(Mutex::new(logger)) };
48
49
    let filter = EnvFilter::from_default_env()
50
        .add_directive(
51
            "matrix_sdk_crypto=trace".parse().expect("Can't parse logging filter directive"),
52
        )
53
        .add_directive(
54
            "matrix_sdk_sqlite=debug".parse().expect("Can't parse logging filter directive"),
55
        );
56
57
    let _ = tracing_subscriber::fmt()
58
        .with_writer(logger)
59
        .with_env_filter(filter)
60
        .with_ansi(false)
61
        .without_time()
62
        .try_init();
63
}