1336d762aSopenharmony_ci/*!
2336d762aSopenharmony_ciUsing `env_logger` to drive a custom logger.
3336d762aSopenharmony_ci
4336d762aSopenharmony_ciBefore running this example, try setting the `MY_LOG_LEVEL` environment variable to `info`:
5336d762aSopenharmony_ci
6336d762aSopenharmony_ci```no_run,shell
7336d762aSopenharmony_ci$ export MY_LOG_LEVEL='info'
8336d762aSopenharmony_ci```
9336d762aSopenharmony_ci
10336d762aSopenharmony_ciIf you only want to change the way logs are formatted, look at the `custom_format` example.
11336d762aSopenharmony_ci*/
12336d762aSopenharmony_ci
13336d762aSopenharmony_ci#[macro_use]
14336d762aSopenharmony_ciextern crate log;
15336d762aSopenharmony_ci
16336d762aSopenharmony_ciuse env_logger::filter::{Builder, Filter};
17336d762aSopenharmony_ci
18336d762aSopenharmony_ciuse log::{Log, Metadata, Record, SetLoggerError};
19336d762aSopenharmony_ci
20336d762aSopenharmony_ciconst FILTER_ENV: &str = "MY_LOG_LEVEL";
21336d762aSopenharmony_ci
22336d762aSopenharmony_cistruct MyLogger {
23336d762aSopenharmony_ci    inner: Filter,
24336d762aSopenharmony_ci}
25336d762aSopenharmony_ci
26336d762aSopenharmony_ciimpl MyLogger {
27336d762aSopenharmony_ci    fn new() -> MyLogger {
28336d762aSopenharmony_ci        let mut builder = Builder::from_env(FILTER_ENV);
29336d762aSopenharmony_ci
30336d762aSopenharmony_ci        MyLogger {
31336d762aSopenharmony_ci            inner: builder.build(),
32336d762aSopenharmony_ci        }
33336d762aSopenharmony_ci    }
34336d762aSopenharmony_ci
35336d762aSopenharmony_ci    fn init() -> Result<(), SetLoggerError> {
36336d762aSopenharmony_ci        let logger = Self::new();
37336d762aSopenharmony_ci
38336d762aSopenharmony_ci        log::set_max_level(logger.inner.filter());
39336d762aSopenharmony_ci        log::set_boxed_logger(Box::new(logger))
40336d762aSopenharmony_ci    }
41336d762aSopenharmony_ci}
42336d762aSopenharmony_ci
43336d762aSopenharmony_ciimpl Log for MyLogger {
44336d762aSopenharmony_ci    fn enabled(&self, metadata: &Metadata) -> bool {
45336d762aSopenharmony_ci        self.inner.enabled(metadata)
46336d762aSopenharmony_ci    }
47336d762aSopenharmony_ci
48336d762aSopenharmony_ci    fn log(&self, record: &Record) {
49336d762aSopenharmony_ci        // Check if the record is matched by the logger before logging
50336d762aSopenharmony_ci        if self.inner.matches(record) {
51336d762aSopenharmony_ci            println!("{} - {}", record.level(), record.args());
52336d762aSopenharmony_ci        }
53336d762aSopenharmony_ci    }
54336d762aSopenharmony_ci
55336d762aSopenharmony_ci    fn flush(&self) {}
56336d762aSopenharmony_ci}
57336d762aSopenharmony_ci
58336d762aSopenharmony_cifn main() {
59336d762aSopenharmony_ci    MyLogger::init().unwrap();
60336d762aSopenharmony_ci
61336d762aSopenharmony_ci    info!("a log from `MyLogger`");
62336d762aSopenharmony_ci}
63