1use std::path::PathBuf;
2
3use log::LevelFilter;
4
5pub enum Duplicate {
7 None = 0,
9 Error = 1,
11 Warn = 2,
13 Info = 3,
15 Debug = 4,
17 Trace = 5,
19 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}