Skip to main content

env_filter/
lib.rs

1//! Filtering for log records.
2//!
3//! You can use the [`Filter`] type in your own logger implementation to use the same
4//! filter parsing and matching as `env_logger`.
5//!
6//! ## Using `env_filter` in your own logger
7//!
8//! You can use `env_filter`'s filtering functionality with your own logger.
9//! Call [`Builder::parse`] to parse directives from a string when constructing
10//! your logger. Call [`Filter::matches`] to check whether a record should be
11//! logged based on the parsed filters when log records are received.
12//!
13//! ```
14//! # #[cfg(feature = "std")] {
15//! use env_filter::Filter;
16//! use log::{Log, Metadata, Record};
17//!
18//! struct PrintLogger;
19//!
20//! impl Log for PrintLogger {
21//!     fn enabled(&self, metadata: &Metadata) -> bool {
22//!         true
23//!     }
24//!
25//!     fn log(&self, record: &Record) {
26//!         println!("{:?}", record);
27//!     }
28//!
29//!     fn flush(&self) {}
30//! }
31//!
32//! let mut builder = env_filter::Builder::new();
33//! // Parse a directives string from an environment variable
34//! if let Ok(ref filter) = std::env::var("MY_LOG_LEVEL") {
35//!     builder.parse(filter);
36//! }
37//!
38//! let logger = env_filter::FilteredLog::new(PrintLogger, builder.build());
39//! # }
40//! ```
41
42#![cfg_attr(docsrs, feature(doc_cfg))]
43#![cfg_attr(all(not(feature = "std"), not(test)), no_std)]
44#![warn(missing_docs)]
45#![warn(clippy::print_stderr)]
46#![warn(clippy::print_stdout)]
47#![warn(clippy::std_instead_of_core)]
48#![warn(clippy::std_instead_of_alloc)]
49
50extern crate alloc;
51
52mod directive;
53mod filter;
54mod filtered_log;
55mod op;
56mod parser;
57
58use directive::enabled;
59use directive::Directive;
60use op::FilterOp;
61use parser::parse_spec;
62
63pub use filter::Builder;
64pub use filter::Filter;
65pub use filtered_log::FilteredLog;
66pub use parser::ParseError;
67
68#[doc = include_str!("../README.md")]
69#[cfg(doctest)]
70pub struct ReadmeDoctests;