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}