env_filter/filtered_log.rs
1use log::Log;
2
3use crate::Filter;
4
5/// Decorate a [`log::Log`] with record [`Filter`]ing.
6///
7/// Records that match the filter will be forwarded to the wrapped log.
8/// Other records will be ignored.
9#[derive(Debug)]
10pub struct FilteredLog<T> {
11 log: T,
12 filter: Filter,
13}
14
15impl<T: Log> FilteredLog<T> {
16 /// Create a new filtered log.
17 pub fn new(log: T, filter: Filter) -> Self {
18 Self { log, filter }
19 }
20}
21
22impl<T: Log> Log for FilteredLog<T> {
23 /// Determines if a log message with the specified metadata would be logged.
24 ///
25 /// For the wrapped log, this returns `true` only if both the filter and the wrapped log return `true`.
26 fn enabled(&self, metadata: &log::Metadata<'_>) -> bool {
27 self.filter.enabled(metadata) && self.log.enabled(metadata)
28 }
29
30 /// Logs the record.
31 ///
32 /// Forwards the record to the wrapped log, but only if the record matches the filter.
33 fn log(&self, record: &log::Record<'_>) {
34 if self.filter.matches(record) {
35 self.log.log(record);
36 }
37 }
38
39 /// Flushes any buffered records.
40 ///
41 /// Forwards directly to the wrapped log.
42 fn flush(&self) {
43 self.log.flush();
44 }
45}