@@ -19,8 +19,10 @@ use atty;
19
19
use colored:: Colorize ;
20
20
use env_logger:: filter:: { Builder as FilterBuilder , Filter } ;
21
21
use log:: { Level , LevelFilter , Log , Metadata , Record } ;
22
+ use parking_lot:: Mutex ;
22
23
use std:: env;
23
24
use std:: thread;
25
+ use std:: time:: { Duration , Instant } ;
24
26
use time;
25
27
26
28
pub struct Config {
@@ -40,6 +42,7 @@ pub struct Logger {
40
42
filter : Filter ,
41
43
stderr_is_tty : bool ,
42
44
email_alarm : Option < EmailAlarm > ,
45
+ last_email_sent : Mutex < Option < Instant > > ,
43
46
}
44
47
45
48
impl Logger {
@@ -58,6 +61,7 @@ impl Logger {
58
61
filter : builder. build ( ) ,
59
62
stderr_is_tty,
60
63
email_alarm,
64
+ last_email_sent : Mutex :: new ( None ) ,
61
65
}
62
66
}
63
67
@@ -108,7 +112,15 @@ impl Log for Logger {
108
112
109
113
if log_level == Level :: Error {
110
114
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
+ }
112
124
}
113
125
}
114
126
}
0 commit comments