-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathmy_logger.rs
98 lines (84 loc) · 2.35 KB
/
my_logger.rs
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
93
94
95
96
97
98
use std::io;
use std::fmt;
use std::error::Error;
use std::path::PathBuf;
use std::fs::OpenOptions;
use chrono::Local;
use slog;
use slog_term;
use slog_stream;
use slog_scope;
use slog::{Level, DrainExt};
macro_rules! now {
() => ( Local::now().format("%m-%d %H:%M:%S%.3f") )
}
macro_rules! setup_global_logger {
($lv:expr, $drain:expr) => (
let d = slog::level_filter($lv, $drain).fuse();
let logger = slog::Logger::root(d, o!());
slog_scope::set_global_logger(logger);
)
}
pub fn init(log_level: i8, log_path: Option<&PathBuf>) -> Result<(), LoggerInitError> {
let log_level = match log_level {
n if n > 1 => Level::Trace,
1 => Level::Debug,
0 => Level::Info,
-1 => Level::Warning,
-2 => Level::Error,
_ => Level::Critical,
};
if let Some(log_path) = log_path {
let f = OpenOptions::new()
.create(true)
.write(true)
.truncate(true)
.open(log_path);
match f {
Ok(file) => {
let streamer = slog_stream::stream(file, MyFormat);
setup_global_logger!(log_level, streamer);
}
Err(_) => {
let errmsg = format!("cannot open log file {:?}", log_path);
return Err(LoggerInitError::new(errmsg));
}
}
} else {
let drain = slog_term::StreamerBuilder::new()
.use_custom_timestamp(move |io| write!(io, "{}", now!()))
.build();
setup_global_logger!(log_level, drain);
}
Ok(())
}
struct MyFormat;
impl slog_stream::Format for MyFormat {
fn format(&self,
io: &mut io::Write,
rinfo: &slog::Record,
_logger_values: &slog::OwnedKeyValueList)
-> io::Result<()> {
let msg = format!("{} {} - {}\n", now!(), rinfo.level(), rinfo.msg());
io.write_all(msg.as_bytes()).map(|_| ())
}
}
#[derive(Debug)]
pub struct LoggerInitError {
desc: String,
}
impl LoggerInitError {
fn new(desc: String) -> LoggerInitError {
LoggerInitError { desc: desc }
}
}
impl fmt::Display for LoggerInitError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.desc)
}
}
impl Error for LoggerInitError {
fn description(&self) -> &str {
&self.desc
}
}