1use crate::fs::get_rigela_program_directory;
15use log::LevelFilter;
16use log4rs::{
17 append::{
18 console::{ConsoleAppender, Target},
19 rolling_file::{
20 policy::compound::{
21 roll::delete::DeleteRoller, trigger::size::SizeTrigger, CompoundPolicy,
22 },
23 RollingFileAppender,
24 },
25 },
26 config::{Appender, Config, Root},
27 encode::pattern::PatternEncoder,
28 filter::threshold::ThresholdFilter,
29 init_config,
30};
31
32const LOG_FILE_NAME: &str = "run.log";
33
34pub fn init_logger(path: Option<&str>) {
39 let level = LevelFilter::Info;
40 let file_path = get_rigela_program_directory()
41 .join("logs")
42 .join(path.unwrap_or(LOG_FILE_NAME));
43
44 let stderr = ConsoleAppender::builder()
46 .encoder(Box::new(PatternEncoder::new("{l} - {m}\n")))
48 .target(Target::Stderr)
49 .build();
50
51 let logfile = RollingFileAppender::builder()
53 .build(
54 file_path,
55 Box::new(CompoundPolicy::new(
56 Box::new(SizeTrigger::new(1024 * 1024)), Box::new(DeleteRoller::new()),
58 )),
59 )
60 .unwrap();
61
62 let config = Config::builder()
64 .appender(Appender::builder().build("logfile", Box::new(logfile)))
65 .appender(
66 Appender::builder()
67 .filter(Box::new(ThresholdFilter::new(level)))
68 .build("stderr", Box::new(stderr)),
69 )
70 .build(
71 Root::builder()
72 .appender("logfile")
73 .appender("stderr")
74 .build(LevelFilter::Trace),
75 )
76 .unwrap();
77
78 init_config(config).expect("Can't initialize the logger.");
80}