webapp_frontend/service/
log.rs

1//! The log service
2
3use failure::{format_err, Fallible};
4use log::{set_logger, set_max_level, Level, LevelFilter, Log, Metadata, Record};
5use stdweb::{_js_impl, js};
6
7/// The public static logger instance
8static LOGGER: LogService = LogService;
9
10/// Initialize the static logger
11pub fn init_logger() -> Fallible<()> {
12    set_logger(&LOGGER)
13        .map(|()| set_max_level(LevelFilter::Trace))
14        .map_err(|_| format_err!("Logger init failed"))
15}
16
17/// The service used for logging purposes
18struct LogService;
19
20impl Log for LogService {
21    fn enabled(&self, metadata: &Metadata) -> bool {
22        metadata.level() <= Level::Trace
23    }
24
25    fn log(&self, record: &Record) {
26        // Verify that the logger is enabled
27        if self.enabled(record.metadata()) {
28            // Create the log entry
29            let mut log_entry = format!("%c{}: %c", record.level());
30
31            // Add file and line if available
32            if let (Some(file), Some(line)) = (record.file(), record.line()) {
33                log_entry += &format!("{}:{}: ", file, line);
34            }
35
36            // Add the body
37            log_entry += &format!("{}", record.args());
38
39            // Log the entry
40            const BOLD: &str = "font-weight: bold";
41            const NORMAL: &str = "font-weight: normal";
42            match record.level() {
43                Level::Error => {
44                    js! { console.error(@{log_entry}, @{BOLD}, @{NORMAL}) }
45                }
46                Level::Warn => {
47                    js! { console.warn(@{log_entry}, @{BOLD}, @{NORMAL}) }
48                }
49                Level::Info => {
50                    js! { console.log(@{log_entry}, @{BOLD}, @{NORMAL}) }
51                }
52                Level::Debug => {
53                    js! { console.debug(@{log_entry}, @{BOLD}, @{NORMAL}) }
54                }
55                Level::Trace => {
56                    js! { console.debug(@{log_entry}, @{BOLD}, @{NORMAL}) }
57                }
58            }
59        }
60    }
61
62    fn flush(&self) {}
63}