1616
1717use std:: env;
1818use std:: thread;
19+ use std:: time:: { Duration , Instant } ;
1920use time;
2021
2122use atty;
2223use colored:: Colorize ;
2324use env_logger:: filter:: { Builder as FilterBuilder , Filter } ;
2425use log:: { Level , LevelFilter , Log , Metadata , Record } ;
26+ use parking_lot:: Mutex ;
2527
2628use crate :: { email:: EmailAlarm , structured_logger, SLOGGER } ;
2729
@@ -42,6 +44,7 @@ pub struct Logger {
4244 filter : Filter ,
4345 stderr_is_tty : bool ,
4446 email_alarm : Option < EmailAlarm > ,
47+ last_email_sent : Mutex < Option < Instant > > ,
4548}
4649
4750impl Logger {
@@ -60,6 +63,7 @@ impl Logger {
6063 filter : builder. build ( ) ,
6164 stderr_is_tty,
6265 email_alarm,
66+ last_email_sent : Mutex :: new ( None ) ,
6367 }
6468 }
6569
@@ -110,7 +114,15 @@ impl Log for Logger {
110114
111115 if log_level == Level :: Error {
112116 if let Some ( email_alarm) = & self . email_alarm {
113- email_alarm. send ( & format ! ( "{} {} {}" , thread_name, log_target, log_message) )
117+ let mut last_email_sent = self . last_email_sent . lock ( ) ;
118+ let sent_recently = match * last_email_sent {
119+ Some ( last_sent) => last_sent. elapsed ( ) < Duration :: from_secs ( 300 ) ,
120+ None => false ,
121+ } ;
122+ if !sent_recently {
123+ email_alarm. send ( & format ! ( "{} {} {}" , thread_name, log_target, log_message) ) ;
124+ * last_email_sent = Some ( Instant :: now ( ) ) ;
125+ }
114126 }
115127 }
116128 }
0 commit comments