diff options
author | Daniel Schadt <kingdread@gmx.de> | 2020-06-26 16:54:11 +0200 |
---|---|---|
committer | Daniel Schadt <kingdread@gmx.de> | 2020-06-26 16:54:11 +0200 |
commit | 86e0f74bd7f0301886c1dda0f147b6c8ffbdd707 (patch) | |
tree | db6dc6aa23b05173c33f9ea5345f7871c8ce62b4 /src/filters/log.rs | |
parent | 1fb3d3259d23410f8bf9879f64de880a11e4f876 (diff) | |
parent | e22b79adaaa69761fc520d6cd57baee1025fa926 (diff) | |
download | raidgrep-86e0f74bd7f0301886c1dda0f147b6c8ffbdd707.tar.gz raidgrep-86e0f74bd7f0301886c1dda0f147b6c8ffbdd707.tar.bz2 raidgrep-86e0f74bd7f0301886c1dda0f147b6c8ffbdd707.zip |
Merge branch 'comparison-filters'
Diffstat (limited to 'src/filters/log.rs')
-rw-r--r-- | src/filters/log.rs | 70 |
1 files changed, 9 insertions, 61 deletions
diff --git a/src/filters/log.rs b/src/filters/log.rs index 8cfdcb4..10258a0 100644 --- a/src/filters/log.rs +++ b/src/filters/log.rs @@ -7,17 +7,12 @@ use super::{ Filter, Inclusion, }; -use std::{collections::HashSet, ffi::OsStr}; +use std::collections::HashSet; use evtclib::Boss; -use chrono::{DateTime, Datelike, Local, TimeZone, Utc, Weekday}; +use chrono::{DateTime, Datelike, Utc, Weekday}; use num_traits::FromPrimitive as _; -use once_cell::sync::Lazy; -use regex::Regex; - -/// The regular expression used to extract datetimes from filenames. -static DATE_REGEX: Lazy<Regex> = Lazy::new(|| Regex::new(r"\d{8}-\d{6}").unwrap()); /// Filter trait used for filters that operate on complete logs. pub trait LogFilter = Filter<EarlyLogResult, LogResult>; @@ -91,23 +86,9 @@ pub fn weekday(weekdays: HashSet<Weekday>) -> Box<dyn LogFilter> { } #[derive(Debug, Clone)] -struct TimeFilter(Option<DateTime<Utc>>, Option<DateTime<Utc>>, bool); +struct TimeFilter(Option<DateTime<Utc>>, Option<DateTime<Utc>>); impl Filter<EarlyLogResult, LogResult> for TimeFilter { - fn filter_early(&self, early_log: &EarlyLogResult) -> Inclusion { - // Ignore the filename heuristic if the user wishes so. - if !self.2 { - return Inclusion::Unknown; - } - early_log - .log_file - .file_name() - .and_then(datetime_from_filename) - .map(|d| time_is_between(d, self.0, self.1)) - .map(Into::into) - .unwrap_or(Inclusion::Unknown) - } - fn filter(&self, log: &LogResult) -> bool { time_is_between(log.time, self.0, self.1) } @@ -133,54 +114,20 @@ fn time_is_between( after_ok && before_ok } -/// Try to extract the log time from the filename. -/// -/// This expects the filename to have the datetime in the pattern `YYYYmmdd-HHMMSS` somewhere in -/// it. -fn datetime_from_filename(name: &OsStr) -> Option<DateTime<Utc>> { - let date_match = DATE_REGEX.find(name.to_str()?)?; - let local_time = Local - .datetime_from_str(date_match.as_str(), "%Y%m%d-%H%M%S") - .ok()?; - Some(local_time.with_timezone(&Utc)) -} - -/// A `LogFilter` that only accepts logs in the given time frame. -/// -/// If a bound is not given, -Infinity is assumed for the lower bound, and Infinity for the upper -/// bound. -pub fn time(lower: Option<DateTime<Utc>>, upper: Option<DateTime<Utc>>) -> Box<dyn LogFilter> { - Box::new(TimeFilter(lower, upper, true)) -} - -/// A `LogFilter` that only accepts logs after the given date. -/// -/// Also see [`time`][time] and [`before`][before]. -pub fn after(when: DateTime<Utc>) -> Box<dyn LogFilter> { - time(Some(when), None) -} - -/// A `LogFilter` that only accepts logs before the given date. -/// -/// Also see [`time`][time] and [`after`][after]. -pub fn before(when: DateTime<Utc>) -> Box<dyn LogFilter> { - time(None, Some(when)) -} - /// A `LogFilter` that only accepts logs in the given time frame. /// -/// Compared to [`time`][time], this filter ignores the file name. This can result in more accurate -/// results if you renamed logs, but if also leads to a worse runtime. +/// Compared to [`-time`][super::values::time], this filter ignores the file name. This can result +/// in more accurate results if you renamed logs, but if also leads to a worse runtime. pub fn log_time(lower: Option<DateTime<Utc>>, upper: Option<DateTime<Utc>>) -> Box<dyn LogFilter> { - Box::new(TimeFilter(lower, upper, false)) + Box::new(TimeFilter(lower, upper)) } -/// Like [`after`][after], but ignores the file name for date calculations. +/// Only include logs after the given date, but ignore the file name for date calculations. pub fn log_after(when: DateTime<Utc>) -> Box<dyn LogFilter> { log_time(Some(when), None) } -/// Like [`before`][before], but ignores the file name for date calculations. +/// Only include logs before the given date, but ignore the file name for date calculations. pub fn log_before(when: DateTime<Utc>) -> Box<dyn LogFilter> { log_time(None, Some(when)) } @@ -202,6 +149,7 @@ pub fn challenge_mote() -> Box<dyn LogFilter> { #[cfg(test)] mod tests { use super::*; + use chrono::TimeZone; #[test] fn test_time_is_between() { |