8
|
1
|
//! logger library |
67
|
2
|
use flexi_logger::{ |
|
3
|
with_thread, AdaptiveFormat, Duplicate, FileSpec, Logger, LoggerHandle, |
|
4
|
}; |
8
|
5
|
pub use log; |
|
6
|
use log::{Level, LevelFilter, Metadata, Record}; |
|
7
|
|
|
8
|
mod err; |
|
9
|
|
|
10
|
pub use err::{Error, Result}; |
|
11
|
|
|
12
|
/// initialize a simple logger |
|
13
|
pub fn simple() -> Result<()> { |
67
|
14
|
log::set_logger(&SimpleLogger) |
|
15
|
.map(|()| log::set_max_level(LevelFilter::Trace))?; |
8
|
16
|
Ok(()) |
|
17
|
} |
|
18
|
|
|
19
|
/// a simple logger |
|
20
|
struct SimpleLogger; |
|
21
|
|
|
22
|
impl log::Log for SimpleLogger { |
|
23
|
fn enabled(&self, metadata: &Metadata) -> bool { |
|
24
|
metadata.level() <= Level::Info |
|
25
|
} |
|
26
|
|
|
27
|
fn log(&self, record: &Record) { |
|
28
|
if self.enabled(record.metadata()) { |
|
29
|
println!("{} - {}", record.level(), record.args()); |
|
30
|
} |
|
31
|
} |
|
32
|
|
|
33
|
fn flush(&self) {} |
|
34
|
} |
|
35
|
|
|
36
|
/// Initialize a `Logger` with a specified logging level |
|
37
|
pub fn flexi(level: &str) -> Result<()> { |
|
38
|
Logger::try_with_env_or_str(level)? |
|
39
|
.format(flexi_logger::colored_default_format) |
|
40
|
.set_palette("196;208;50;7;8".to_string()) |
|
41
|
.adaptive_format_for_stderr(AdaptiveFormat::Detailed) |
|
42
|
.adaptive_format_for_stdout(AdaptiveFormat::Default) |
|
43
|
.log_to_stdout() |
|
44
|
.start()?; |
|
45
|
Ok(()) |
|
46
|
} |
|
47
|
|
|
48
|
/// Initialize file Logger |
|
49
|
pub fn file(env: &str, log_path: &str, log_name: &str) -> Result<LoggerHandle> { |
|
50
|
Ok( |
|
51
|
Logger::try_with_env_or_str(env)? |
|
52
|
.log_to_file( |
|
53
|
FileSpec::default() |
|
54
|
.suppress_timestamp() |
|
55
|
.directory(log_path) |
|
56
|
.basename(log_name) |
|
57
|
.suffix("log"), |
|
58
|
) |
|
59
|
.format_for_files(with_thread) |
|
60
|
.append() |
|
61
|
.duplicate_to_stdout(Duplicate::Error) |
|
62
|
.start()?, |
|
63
|
) |
|
64
|
} |
|
65
|
|
|
66
|
#[cfg(test)] |
|
67
|
mod tests; |