tin_logger/
config.rs

1use std::path::PathBuf;
2
3use log::LevelFilter;
4
5// 自定义类型
6pub enum Duplicate {
7    /// No messages are duplicated.
8    None = 0,
9    /// Only error messages are duplicated.
10    Error = 1,
11    /// Error and warn messages are duplicated.
12    Warn = 2,
13    /// Error, warn, and info messages are duplicated.
14    Info = 3,
15    /// Error, warn, info, and debug messages are duplicated.
16    Debug = 4,
17    /// All messages are duplicated.
18    Trace = 5,
19    /// All messages are duplicated.
20    All = 6,
21}
22
23impl From<Duplicate> for flexi_logger::Duplicate {
24    fn from(val: Duplicate) -> Self {
25        match val {
26            Duplicate::None => flexi_logger::Duplicate::None,
27            Duplicate::Error => flexi_logger::Duplicate::Error,
28            Duplicate::Warn => flexi_logger::Duplicate::Warn,
29            Duplicate::Info => flexi_logger::Duplicate::Info,
30            Duplicate::Debug => flexi_logger::Duplicate::Debug,
31            Duplicate::Trace => flexi_logger::Duplicate::Trace,
32            Duplicate::All => flexi_logger::Duplicate::All,
33        }
34    }
35}
36
37impl From<u8> for Duplicate {
38    fn from(val: u8) -> Self {
39        match val {
40            0 => Duplicate::None,
41            1 => Duplicate::Error,
42            2 => Duplicate::Warn,
43            3 => Duplicate::Info,
44            4 => Duplicate::Debug,
45            5 => Duplicate::Trace,
46            6 => Duplicate::All,
47            _ => unreachable!(),
48        }
49    }
50}
51
52pub struct LoggerConfig {
53    pub level: LevelFilter,
54    pub directory: PathBuf,
55    pub basename: String,
56    pub suffix: String,
57    pub rotate_size: u64,
58    pub duplicate_to_stdout: Duplicate,
59}
60
61impl Default for LoggerConfig {
62    fn default() -> Self {
63        Self {
64            level: LevelFilter::Info,
65            directory: PathBuf::from("logs"),
66            basename: "app".to_string(),
67            suffix: "log".to_string(),
68            rotate_size: 100 * 1024 * 1024,
69            duplicate_to_stdout: Duplicate::None,
70        }
71    }
72}
73
74impl LoggerConfig {
75    pub fn builder() -> LoggerConfigBuilder {
76        LoggerConfigBuilder::default()
77    }
78}
79
80#[derive(Default)]
81pub struct LoggerConfigBuilder {
82    level: Option<LevelFilter>,
83    directory: Option<PathBuf>,
84    basename: Option<String>,
85    suffix: Option<String>,
86    rotate_size: Option<u64>,
87    duplicate_to_stdout: Option<Duplicate>,
88}
89
90impl LoggerConfigBuilder {
91    pub fn level(mut self, level: LevelFilter) -> Self {
92        self.level = Some(level);
93        self
94    }
95    pub fn directory<P: Into<PathBuf>>(mut self, directory: P) -> Self {
96        self.directory = Some(directory.into());
97        self
98    }
99    pub fn basename<S: Into<String>>(mut self, basename: S) -> Self {
100        self.basename = Some(basename.into());
101        self
102    }
103    pub fn suffix<S: Into<String>>(mut self, suffix: S) -> Self {
104        self.suffix = Some(suffix.into());
105        self
106    }
107    pub fn rotate_size(mut self, rotate_size: u64) -> Self {
108        self.rotate_size = Some(rotate_size);
109        self
110    }
111    pub fn duplicate_to_stdout(mut self, duplicate: Duplicate) -> Self {
112        self.duplicate_to_stdout = Some(duplicate);
113        self
114    }
115    pub fn build(self) -> LoggerConfig {
116        LoggerConfig {
117            level: self.level.unwrap_or(LevelFilter::Info),
118            directory: self.directory.unwrap_or_else(|| PathBuf::from("logs")),
119            basename: self.basename.unwrap_or_else(|| "app".to_string()),
120            suffix: self.suffix.unwrap_or_else(|| "log".to_string()),
121            rotate_size: self.rotate_size.unwrap_or(100 * 1024 * 1024),
122            duplicate_to_stdout: self.duplicate_to_stdout.unwrap_or(Duplicate::All),
123        }
124    }
125}