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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//! Logging configuration

use log;
use log::{LogLevel, SetLoggerError, LogMetadata, LogRecord};
use chrono::*;

/// The logging manager for the system
#[allow(unused)]
pub struct TrustDnsLogger {
    level: LogLevel,
}

impl TrustDnsLogger {
    /// Configure a logger with the given log level
    pub fn new(level: LogLevel) -> TrustDnsLogger {
        TrustDnsLogger { level: level }
    }

    /// Initializes the logger.
    pub fn init(self) -> Result<(), SetLoggerError> {
        let result = log::set_logger(|max_log_level| {
                                         max_log_level.set(self.level.to_log_level_filter());
                                         Box::new(self)
                                     });

        info!("logging initialized");

        result
    }

    /// Enables the logger with the given `LogLevel`
    pub fn enable_logging(log_level: LogLevel) {
        Self::new(log_level).init().is_ok();
    }
}

impl log::Log for TrustDnsLogger {
    fn enabled(&self, metadata: &LogMetadata) -> bool {
        metadata.level() <= self.level
    }

    fn log(&self, record: &LogRecord) {
        if self.enabled(record.metadata()) {
            let local: DateTime<Utc> = Utc::now();

            println!("{} {} {}:{} {}",
                     local.to_rfc3339(),
                     record.level(),
                     record.location().module_path(),
                     record.location().line(),
                     record.args());
        }
    }
}