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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#[cfg(test)]
#[path = "./logger_test.rs"]
mod logger_test;
use fern;
use log::{LogLevel, LogLevelFilter};
use std::env;
use std::io::stdout;
#[cfg(test)]
fn exit(code: i32) {
panic!(code);
}
#[cfg(not(test))]
use std::process::exit;
#[derive(Debug, PartialEq)]
pub enum Level {
VERBOSE,
INFO,
ERROR
}
fn get_level(level_name: &str) -> Level {
let mut level = Level::INFO;
if level_name == "verbose" {
level = Level::VERBOSE;
} else if level_name == "error" {
level = Level::ERROR;
}
level
}
pub fn get_log_level() -> String {
let level = if log_enabled!(LogLevel::Trace) {
"verbose"
} else if log_enabled!(LogLevel::Info) {
"info"
} else {
"error"
};
level.to_string()
}
pub fn init(level_name: &str) {
let level = get_level(level_name);
let (log_level, level_name_value) = match level {
Level::VERBOSE => (LogLevelFilter::Trace, "verbose"),
Level::INFO => (LogLevelFilter::Info, "info"),
Level::ERROR => (LogLevelFilter::Error, "error"),
};
env::set_var("CARGO_MAKE_LOG_LEVEL", level_name_value);
let result = fern::Dispatch::new()
.format(|out, message, record| {
let name = env!("CARGO_PKG_NAME");
let record_level = record.level();
out.finish(format_args!("[{}] {} - {}", &name, record_level, message));
if record_level == LogLevel::Error {
warn!("Build Failed.");
exit(1);
}
})
.level(log_level)
.chain(stdout())
.apply();
if result.is_err() {
println!("Unable to setup logger.");
}
}