diff --git a/util/logger/src/logger.rs b/util/logger/src/logger.rs index 82b66357c1..045a8508d8 100644 --- a/util/logger/src/logger.rs +++ b/util/logger/src/logger.rs @@ -16,12 +16,14 @@ use std::env; use std::thread; +use std::time::{Duration, Instant}; use time; use atty; use colored::Colorize; use env_logger::filter::{Builder as FilterBuilder, Filter}; use log::{Level, LevelFilter, Log, Metadata, Record}; +use parking_lot::Mutex; use crate::{email::EmailAlarm, structured_logger, SLOGGER}; @@ -42,6 +44,7 @@ pub struct Logger { filter: Filter, stderr_is_tty: bool, email_alarm: Option, + last_email_sent: Mutex>, } impl Logger { @@ -60,6 +63,7 @@ impl Logger { filter: builder.build(), stderr_is_tty, email_alarm, + last_email_sent: Mutex::new(None), } } @@ -110,7 +114,15 @@ impl Log for Logger { if log_level == Level::Error { if let Some(email_alarm) = &self.email_alarm { - email_alarm.send(&format!("{} {} {}", thread_name, log_target, log_message)) + let mut last_email_sent = self.last_email_sent.lock(); + let sent_recently = match *last_email_sent { + Some(last_sent) => last_sent.elapsed() < Duration::from_secs(300), + None => false, + }; + if !sent_recently { + email_alarm.send(&format!("{} {} {}", thread_name, log_target, log_message)); + *last_email_sent = Some(Instant::now()); + } } } }