1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use log::{self, LogRecord, LogLevelFilter, LogMetadata, SetLoggerError};
use std::sync::{Arc, Mutex};
pub struct StdoutLogger {
outputfn: Arc<Mutex<fn(&LogRecord)>>,
}
impl StdoutLogger {
pub fn new(outputfn: fn(&LogRecord)) -> StdoutLogger {
StdoutLogger { outputfn: Arc::new(Mutex::new(outputfn)) }
}
}
impl log::Log for StdoutLogger {
fn enabled(&self, _metadata: &LogMetadata) -> bool {
true
}
fn log(&self, record: &LogRecord) {
if self.enabled(record.metadata()) {
match self.outputfn.lock() {
Ok(ref mut f) => f(record),
Err(_) => {}
}
}
}
}
pub fn init_stdout_logger(level: LogLevelFilter,
logger: StdoutLogger)
-> Result<(), SetLoggerError> {
log::set_logger(|max_log_level| {
max_log_level.set(level);
Box::new(logger)
})
}