webapp_frontend/service/
log.rs1use failure::{format_err, Fallible};
4use log::{set_logger, set_max_level, Level, LevelFilter, Log, Metadata, Record};
5use stdweb::{_js_impl, js};
6
7static LOGGER: LogService = LogService;
9
10pub 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
17struct 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 if self.enabled(record.metadata()) {
28 let mut log_entry = format!("%c{}: %c", record.level());
30
31 if let (Some(file), Some(line)) = (record.file(), record.line()) {
33 log_entry += &format!("{}:{}: ", file, line);
34 }
35
36 log_entry += &format!("{}", record.args());
38
39 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}