1 /*!
2 Using `env_logger` to drive a custom logger.
3 
4 Before running this example, try setting the `MY_LOG_LEVEL` environment variable to `info`:
5 
6 ```no_run,shell
7 $ export MY_LOG_LEVEL='info'
8 ```
9 
10 If you only want to change the way logs are formatted, look at the `custom_format` example.
11 */
12 
13 use env_logger::filter::{Builder, Filter};
14 
15 use log::{info, Log, Metadata, Record, SetLoggerError};
16 
17 const FILTER_ENV: &str = "MY_LOG_LEVEL";
18 
19 struct MyLogger {
20     inner: Filter,
21 }
22 
23 impl MyLogger {
new() -> MyLogger24     fn new() -> MyLogger {
25         let mut builder = Builder::from_env(FILTER_ENV);
26 
27         MyLogger {
28             inner: builder.build(),
29         }
30     }
31 
init() -> Result<(), SetLoggerError>32     fn init() -> Result<(), SetLoggerError> {
33         let logger = Self::new();
34 
35         log::set_max_level(logger.inner.filter());
36         log::set_boxed_logger(Box::new(logger))
37     }
38 }
39 
40 impl Log for MyLogger {
enabled(&self, metadata: &Metadata) -> bool41     fn enabled(&self, metadata: &Metadata) -> bool {
42         self.inner.enabled(metadata)
43     }
44 
log(&self, record: &Record)45     fn log(&self, record: &Record) {
46         // Check if the record is matched by the logger before logging
47         if self.inner.matches(record) {
48             println!("{} - {}", record.level(), record.args());
49         }
50     }
51 
flush(&self)52     fn flush(&self) {}
53 }
54 
main()55 fn main() {
56     MyLogger::init().unwrap();
57 
58     info!("a log from `MyLogger`");
59 }
60