captains_log/
config.rs

1use log::{Level, LevelFilter};
2use std::path::Path;
3use crate::{
4    log_impl::LoggerSink,
5    formatter::LogFormat,
6    file_impl::LoggerSinkFile,
7};
8
9/// Global config to setup logger
10/// See crate::recipe for usage
11
12#[derive(Default)]
13pub struct Builder {
14
15    /// Force re-initialize GlobalLogger even it exists,
16    /// useful to setup different logger in multiple types of test cases
17    pub force: bool,
18
19    /// Listen for signal of log-rotate
20    pub rotation_signals: Vec<i32>,
21
22    /// Hookup to log error when panic
23    pub panic: bool,
24
25    /// Whether to exit program after panic
26    pub continue_when_panic: bool,
27
28    /// Different types of log sink
29    pub sinks: Vec<Box<dyn SinkConfigTrait>>
30}
31
32
33impl Builder {
34
35    pub fn new() -> Self{
36        Self::default()
37    }
38
39    /// Add log-rotate signal
40    pub fn signal(mut self, signal: i32) -> Self {
41        self.rotation_signals.push(signal);
42        self
43    }
44
45    /// Add file sink
46    pub fn file(mut self, config: LogFile) -> Self {
47        self.sinks.push(Box::new(config));
48        self
49    }
50
51    /// Return the max log level in the log sinks
52    pub fn get_max_level(&self) -> LevelFilter {
53        let mut max_level = Level::Error;
54        for sink in &self.sinks {
55            let level = sink.get_level();
56            if level > max_level {
57                max_level = level;
58            }
59        }
60        return max_level.to_level_filter();
61    }
62}
63
64pub trait SinkConfigTrait {
65
66    fn get_level(&self) -> Level;
67    fn get_file_path(&self) -> Option<Box<Path>>;
68    fn build(&self) -> LoggerSink;
69}
70
71/// Config for file sink
72pub struct LogFile {
73
74    /// Directory path
75    pub dir: String,
76
77    /// max log level in this file
78    pub level: Level,
79
80    /// filename
81    pub name: String,
82
83    pub(crate) format: LogFormat,
84
85    /// path: dir/name
86    pub file_path: Box<Path>,
87}
88
89impl LogFile {
90
91    pub fn new(dir: &str, name: &str, level: Level, format: LogFormat) -> Self {
92        let file_path = Path::new(dir).join(Path::new(name)).into_boxed_path();
93        Self{
94            dir: dir.to_string(),
95            name: name.to_string(),
96            level,
97            format,
98            file_path,
99        }
100    }
101}
102
103impl SinkConfigTrait for LogFile {
104
105    fn get_level(&self) -> Level {
106        self.level
107    }
108
109    fn get_file_path(&self) -> Option<Box<Path>> {
110        Some(self.file_path.clone())
111    }
112
113    fn build(&self) -> LoggerSink {
114        LoggerSink::File(LoggerSinkFile::new(self))
115    }
116}