simplelog_config/
lib.rs

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}