16
16
17
17
use std:: env;
18
18
use std:: thread;
19
+ use std:: time:: { Duration , Instant } ;
19
20
use time;
20
21
21
22
use atty;
22
23
use colored:: Colorize ;
23
24
use env_logger:: filter:: { Builder as FilterBuilder , Filter } ;
24
25
use log:: { Level , LevelFilter , Log , Metadata , Record } ;
26
+ use parking_lot:: Mutex ;
25
27
26
28
use crate :: { email:: EmailAlarm , structured_logger, SLOGGER } ;
27
29
@@ -42,6 +44,7 @@ pub struct Logger {
42
44
filter : Filter ,
43
45
stderr_is_tty : bool ,
44
46
email_alarm : Option < EmailAlarm > ,
47
+ last_email_sent : Mutex < Option < Instant > > ,
45
48
}
46
49
47
50
impl Logger {
@@ -60,6 +63,7 @@ impl Logger {
60
63
filter : builder. build ( ) ,
61
64
stderr_is_tty,
62
65
email_alarm,
66
+ last_email_sent : Mutex :: new ( None ) ,
63
67
}
64
68
}
65
69
@@ -110,7 +114,15 @@ impl Log for Logger {
110
114
111
115
if log_level == Level :: Error {
112
116
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
+ }
114
126
}
115
127
}
116
128
}
0 commit comments