1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#![cfg(feature = "progress-updates")]
use log::LevelFilter;
use log4rs::append::file::FileAppender;
use log4rs::config::{Appender, Config, Root};
use log4rs::filter::threshold::ThresholdFilter;
use std::error::Error;
pub fn init(filename: impl Into<String>, debug_logging: bool) -> bool {
let file_appender = FileAppender::builder()
.append(false)
.build(filename.into())
.unwrap();
let appender = Appender::builder()
.build("logfile", Box::new(file_appender));
let progress_appender = Appender::builder()
.filter(Box::new(ThresholdFilter::new(LevelFilter::Info)))
.build("progress", Box::new(ProgressAppender::new()));
let root = Root::builder()
.appender("logfile")
.appender("progress")
.build(
if debug_logging { LevelFilter::Debug } else { LevelFilter::Info }
);
let config = Config::builder()
.appender(appender)
.appender(progress_appender)
.build(root)
.unwrap();
log4rs::init_config(config).is_ok()
}
#[derive(Clone, Debug)]
struct ProgressAppender {}
impl ProgressAppender {
fn new() -> Self {
Self {}
}
}
impl log4rs::append::Append for ProgressAppender {
fn append(&self, record: &log::Record) -> Result<(), Box<dyn Error + Sync + Send>> {
crate::progress::process_log_message(record)
}
fn flush(&self) { }
}