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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use failure::{bail, Error};
use log::LevelFilter;
use log4rs::append::console::ConsoleAppender;
use log4rs::config::Config;
use log4rs::encode::pattern::PatternEncoder;
use log4rs_syslog::SyslogAppender;
use std::env;
pub fn init(service_name: &str) -> Result<(), Error> {
let stdout_flag = get_stdout_flag();
let log_level = get_log_level()?;
let syslog_encoder = Box::new(PatternEncoder::new("{m}"));
let syslog = Box::new(
SyslogAppender::builder()
.encoder(syslog_encoder)
.openlog(
service_name,
log4rs_syslog::LogOption::LOG_PID | log4rs_syslog::LogOption::LOG_CONS,
log4rs_syslog::Facility::Daemon,
)
.build(),
);
let stdout_appender = Box::new(ConsoleAppender::builder().build());
let config_builder = Config::builder();
let config_builder =
config_builder.appender(log4rs::config::Appender::builder().build("syslog", syslog));
let config_builder = if stdout_flag {
config_builder
.appender(log4rs::config::Appender::builder().build("stdout", stdout_appender))
} else {
config_builder
};
let root_builder = log4rs::config::Root::builder();
let root_builder = root_builder.appender("syslog");
let root_builder = if stdout_flag {
root_builder.appender("stdout")
} else {
root_builder
};
let root_config = root_builder.build(log_level);
let config = config_builder.build(root_config)?;
log4rs::init_config(config)?;
Ok(())
}
fn get_log_level() -> Result<LevelFilter, Error> {
let mut args = env::args();
let config_arg_pos = args.position(|arg| arg == "-l");
if let Some(_pos) = config_arg_pos {
match args.next() {
Some(path) => match path.as_str() {
"error" => Ok(LevelFilter::Error),
"warn" => Ok(LevelFilter::Warn),
"info" => Ok(LevelFilter::Info),
"debug" => Ok(LevelFilter::Debug),
"trace" => Ok(LevelFilter::Trace),
_ => bail!("The '-l' arg was specified, but an invalid log level was provided"),
},
None => bail!("The '-l' arg was specified, but no log level was provided"),
}
} else {
Ok(LevelFilter::Debug)
}
}
fn get_stdout_flag() -> bool {
let mut args = env::args();
args.any(|arg| arg == "--stdout")
}