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
//! stdout Logger.
use log::{self, LogRecord, LogLevelFilter, LogMetadata, SetLoggerError};
use std::sync::{Arc, Mutex};

/// StdoutLogger.
pub struct StdoutLogger {
    outputfn: Arc<Mutex<fn(&LogRecord)>>,
}

impl StdoutLogger {
    /// Create a new 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(_) => {}
            }
        }
    }
}

/// Initialize the stdout logger.
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)
    })
}