| 12 | }; |
| 13 | |
| 14 | pub fn init_logging(root_dir: &Path) -> anyhow::Result<Handle> { |
| 15 | let level = log::LevelFilter::Debug; |
| 16 | |
| 17 | let log_dir = root_dir.join("log"); |
| 18 | if !log_dir.exists() { |
| 19 | fs::create_dir(&log_dir).context("Failed to create log directory")?; |
| 20 | } |
| 21 | |
| 22 | let log_path = log_dir.join("bootstrapper.log"); |
| 23 | |
| 24 | // Build a stderr logger. |
| 25 | let stderr = ConsoleAppender::builder().target(Target::Stderr).build(); |
| 26 | |
| 27 | // Logging to log file. |
| 28 | let log_file = FileAppender::builder() |
| 29 | // Pattern: https://docs.rs/log4rs/*/log4rs/encode/pattern/index.html |
| 30 | .encoder(Box::new(PatternEncoder::new("{d} - {m}{n}"))) |
| 31 | .build(log_path) |
| 32 | .context("Failed to create file appender")?; |
| 33 | |
| 34 | let config = Config::builder() |
| 35 | .appender(Appender::builder().build("logfile", Box::new(log_file))) |
| 36 | .appender( |
| 37 | Appender::builder() |
| 38 | .filter(Box::new(ThresholdFilter::new(level))) |
| 39 | .build("stderr", Box::new(stderr)), |
| 40 | ) |
| 41 | .build( |
| 42 | Root::builder() |
| 43 | .appender("logfile") |
| 44 | .appender("stderr") |
| 45 | .build(LevelFilter::Trace), |
| 46 | ) |
| 47 | .context("Failed to build config")?; |
| 48 | |
| 49 | let handle = log4rs::init_config(config).context("failed to initiate config")?; |
| 50 | |
| 51 | Ok(handle) |
| 52 | } |