1use simplelog;
2use serde::Deserialize;
3use std::fs::OpenOptions;
4use log::SetLoggerError;
5
6const FORMAT: &str = "[%d.%m.%Y %H:%M:%S]";
7
8#[derive(Deserialize, Debug)]
9pub struct LogConfig{
10 pub term_logger: Option<TermLogConfig>,
11 pub write_logger: Option<WriteLogConfig>,
12}
13
14#[derive(Deserialize, Debug)]
15pub struct TermLogConfig{
16 pub log_level: LogLevel,
17}
18
19#[derive(Deserialize, Debug)]
20pub struct WriteLogConfig{
21 pub log_level: LogLevel,
22 pub path: String,
23}
24
25#[derive(Deserialize, Debug)]
26pub enum LogLevel{
27 Off,
28 Error,
29 Warn,
30 Info,
31 Debug,
32 Trace,
33}
34
35impl LogLevel{
36 pub fn to_level_filter(&self) -> simplelog::LevelFilter{
37 match self{
38 LogLevel::Off => {simplelog::LevelFilter::Off}
39 LogLevel::Error => {simplelog::LevelFilter::Error}
40 LogLevel::Warn => {simplelog::LevelFilter::Warn}
41 LogLevel::Info => {simplelog::LevelFilter::Info}
42 LogLevel::Debug => {simplelog::LevelFilter::Debug}
43 LogLevel::Trace => {simplelog::LevelFilter::Trace}
44 }
45 }
46}
47
48pub fn setup_logger(config: &Vec<LogConfig>) -> Result<(), SetLoggerError> {
49 let mut loggers: Vec<Box<dyn simplelog::SharedLogger>> = Vec::new();
50 for log_conf in config{
51 if let Some(term_logger_conf) = &log_conf.term_logger{
52 let conf = simplelog::ConfigBuilder::new().set_time_format_str(FORMAT).build();
53 loggers.push(simplelog::TermLogger::new(term_logger_conf.log_level.to_level_filter(),
54 conf,
55 simplelog::TerminalMode::Mixed,
56 simplelog::ColorChoice::Auto));
57 }
58 if let Some(write_logger_conf) = &log_conf.write_logger{
59 let conf = simplelog::ConfigBuilder::new().set_time_format_str(FORMAT).build();
60 let file = OpenOptions::new().write(true).append(true).create(true).open(write_logger_conf.path.clone()).expect("Cannot open log file");
61 loggers.push(simplelog::WriteLogger::new(write_logger_conf.log_level.to_level_filter(),
62 conf,
63 file));
64 }
65 }
66 simplelog::CombinedLogger::init(loggers)
67}