Skip to main content

loggify/
log_builder.rs

1use crate::Loggify;
2
3use log;
4use log::{Level, SetLoggerError};
5
6/// Struct for building a new logger
7pub struct LogBuilder {
8    exclude: Vec<String>,
9    level: Level,
10    time_format: String,
11    log_target: bool,
12    color: bool
13}
14
15impl LogBuilder {
16    /// Creates a new instance of the `LogBuilder`
17    /// 
18    /// # Defaults
19    /// - `level` -> The default level is `Info`
20    /// - `exclude` -> No targets are excluded
21    /// - `time_format` -> dd.mm.YY HH:MM:SS
22    /// - `log_target` -> false
23    /// 
24    /// # Example
25    /// ```
26    /// //! Example for initializing the logger with the LogBuilder
27    /// use log::{error, warn, info, debug, trace};
28    /// use loggify::LogBuilder;
29    /// 
30    /// /// The `LogBuilder` is used to set more logger options
31    /// /// This example will change the log level to Trace
32    /// /// and the printed time format to time only
33    /// fn main() {
34    ///     LogBuilder::new()
35    ///         .set_level(log::Level::Trace)
36    ///         .set_time_format(String::from("%H:%M:%S"))
37    ///         .build()
38    ///         .unwrap();
39    /// 
40    ///     error!("My error message");
41    ///     warn!("My warn message");
42    ///     info!("My info message");
43    ///     debug!("My debug message");
44    ///     trace!("My trace message");
45    /// }
46    /// ```
47    pub fn new() -> Self {
48        Self::default()
49    }
50
51    /// Adds a new target to exclude from logging
52    /// 
53    /// See the example `exclude` for usage
54    pub fn add_exclude(mut self, name: String) -> Self {
55        self.exclude.push(name);
56        self
57    }
58
59    /// Sets the minimum level
60    pub fn set_level(mut self, level: Level) -> Self {
61        self.level = level;
62        self
63    }
64
65    /// Sets the time format
66    /// See https://docs.rs/chrono/0.4.6/chrono/format/strftime/index.html for supported escape sequences
67    pub fn set_time_format(mut self, format: String) -> Self {
68        self.time_format = format;
69        self
70    }
71
72    /// Defines if the log target should be printed or not
73    /// This option should be used to find out where a log comes
74    /// from and what target to exclude from logging
75    pub fn set_log_target(mut self, state: bool) -> Self {
76        self.log_target = state;
77        self
78    }
79
80    /// Disables color output
81    /// Per default `true`
82    pub fn disable_color(mut self) -> Self {
83        self.color = false;
84        self
85    }
86
87    /// Creates a new logger
88    pub fn build(self) -> Result<(), SetLoggerError> {
89        let logger = Loggify { 
90            level: self.level, 
91            exclude: self.exclude,
92            time_format: self.time_format,
93            log_target: self.log_target,
94            color: self.color
95        };
96        log::set_boxed_logger(Box::new(logger))?;
97        log::set_max_level(self.level.to_level_filter());
98        Ok(())
99    }
100}
101
102impl Default for LogBuilder {
103    fn default() -> Self {
104        Self {
105            level: Level::Info,
106            exclude: Vec::new(),
107            time_format: String::from("%d.%m.%Y %H:%M:%S"),
108            log_target: false,
109            color: std::env::var("LOGGIFY_COLOR")
110                .map(|x| x.parse().unwrap_or(true))
111                .unwrap_or(true)
112        }
113    }
114}