cyfs_debug/log_util/
combine_logger.rs

1use log::*;
2
3pub fn str_to_logfilter_level(level: &str) -> LevelFilter {
4    match level {
5        "trace" => LevelFilter::Trace,
6        "debug" => LevelFilter::Debug,
7        "info" => LevelFilter::Info,
8        "warn" => LevelFilter::Warn,
9        "error" => LevelFilter::Error,
10        "off" => LevelFilter::Off,
11        _ => LevelFilter::Off,
12    }
13}
14
15pub fn str_to_log_level(level: &str) -> Level {
16    match level {
17        "trace" => Level::Trace,
18        "debug" => Level::Debug,
19        "info" => Level::Info,
20        "warn" => Level::Warn,
21        "error" => Level::Error,
22        _ => Level::Error,
23    }
24}
25
26pub struct CombineLogger {
27    loggers: Vec<Box<dyn Log>>
28}
29
30impl CombineLogger {
31    pub fn new() -> CombineLogger
32    {
33        CombineLogger{loggers: vec![]}
34    }
35
36    pub fn append(mut self, logger: Box<dyn Log>) -> Self {
37        self.loggers.push(logger);
38        self
39    }
40    
41    pub fn start(self) -> bool {
42        // 处理多个模块都嵌有Logger的情况,如果已经设置过logger,这个函数不起作用,返回false,以第一次创建的为准
43        // 成功注册,则返回true
44        if let Err(e) = log::set_boxed_logger(Box::new(self)) {
45            warn!("logger already initialized, use prev one. {}", e);
46            false
47        } else {
48            true
49        }
50    }
51}
52
53impl Log for CombineLogger {
54    fn enabled(&self, metadata: &Metadata) -> bool {
55        let mut ret = true;
56        for logger in &self.loggers {
57            ret = ret | logger.enabled(metadata);
58        }
59        ret
60    }
61
62    fn log(&self, record: &Record) {
63        for logger in &self.loggers {
64            logger.log(record);
65        }
66    }
67
68    fn flush(&self) {
69        for logger in &self.loggers {
70            logger.flush();
71        }
72    }
73}