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