@@ -19,8 +19,10 @@ use atty;
1919use colored:: Colorize ;
2020use env_logger:: filter:: { Builder as FilterBuilder , Filter } ;
2121use log:: { Level , LevelFilter , Log , Metadata , Record } ;
22+ use parking_lot:: Mutex ;
2223use std:: env;
2324use std:: thread;
25+ use std:: time:: { Duration , Instant } ;
2426use time;
2527
2628pub struct Config {
@@ -40,6 +42,7 @@ pub struct Logger {
4042 filter : Filter ,
4143 stderr_is_tty : bool ,
4244 email_alarm : Option < EmailAlarm > ,
45+ last_email_sent : Mutex < Option < Instant > > ,
4346}
4447
4548impl Logger {
@@ -58,6 +61,7 @@ impl Logger {
5861 filter : builder. build ( ) ,
5962 stderr_is_tty,
6063 email_alarm,
64+ last_email_sent : Mutex :: new ( None ) ,
6165 }
6266 }
6367
@@ -108,7 +112,15 @@ impl Log for Logger {
108112
109113 if log_level == Level :: Error {
110114 if let Some ( email_alarm) = & self . email_alarm {
111- email_alarm. send ( & format ! ( "{} {} {}" , thread_name, log_target, log_message) )
115+ let mut last_email_sent = self . last_email_sent . lock ( ) ;
116+ let sent_recently = match * last_email_sent {
117+ Some ( last_sent) => last_sent. elapsed ( ) < Duration :: from_secs ( 300 ) ,
118+ None => false ,
119+ } ;
120+ if !sent_recently {
121+ email_alarm. send ( & format ! ( "{} {} {}" , thread_name, log_target, log_message) ) ;
122+ * last_email_sent = Some ( Instant :: now ( ) ) ;
123+ }
112124 }
113125 }
114126 }
0 commit comments