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