libmultilog/
stdout.rs

1//! stdout Logger.
2use log::{self, LogRecord, LogLevelFilter, LogMetadata, SetLoggerError};
3use std::sync::{Arc, Mutex};
4
5/// StdoutLogger.
6pub struct StdoutLogger {
7    outputfn: Arc<Mutex<fn(&LogRecord)>>,
8}
9
10impl StdoutLogger {
11    /// Create a new StdoutLogger.
12    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
32/// Initialize the stdout logger.
33pub 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}