1use std::fs::{self, OpenOptions};
2use std::path::Path;
3
4use crate::{Error, Result};
5
6pub const DEFAULT_LOG_LEVEL: u8 = 4;
7
8pub fn init_file_logger(path: &Path, log_level: u8) -> Result<()> {
9 if let Some(parent) = path.parent() {
10 fs::create_dir_all(parent)?;
11 }
12 let file = OpenOptions::new().create(true).append(true).open(path)?;
13 let mut builder = env_logger::Builder::new();
14 builder
15 .filter_level(level_filter(log_level))
16 .format_timestamp_secs()
17 .target(env_logger::Target::Pipe(Box::new(file)));
18 builder
19 .try_init()
20 .map_err(|err| Error::msg(format!("failed to initialize logging: {err}")))
21}
22
23pub fn level_filter(log_level: u8) -> log::LevelFilter {
24 match log_level {
25 0 | 1 => log::LevelFilter::Error,
26 2 => log::LevelFilter::Warn,
27 3 | 4 => log::LevelFilter::Info,
28 5 | 6 => log::LevelFilter::Debug,
29 _ => log::LevelFilter::Trace,
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36
37 #[test]
38 fn maps_rngit_log_levels_to_rust_filters() {
39 assert_eq!(level_filter(0), log::LevelFilter::Error);
40 assert_eq!(level_filter(2), log::LevelFilter::Warn);
41 assert_eq!(level_filter(4), log::LevelFilter::Info);
42 assert_eq!(level_filter(6), log::LevelFilter::Debug);
43 assert_eq!(level_filter(7), log::LevelFilter::Trace);
44 }
45}