@@ -32,15 +32,22 @@ pub struct TimeTriggerConfig {
3232 max_random_delay : u64 ,
3333}
3434
35+ #[ cfg( not( feature = "config_parsing" ) ) ]
36+ /// Configuration for the time trigger.
37+ #[ derive( Copy , Clone , Eq , PartialEq , Hash , Debug , Default ) ]
38+ pub struct TimeTriggerConfig {
39+ /// The date/time interval between log file rolls.Q
40+ pub interval : TimeTriggerInterval ,
41+ /// Whether to modulate the interval.
42+ pub modulate : bool ,
43+ /// The maximum random delay in seconds.
44+ pub max_random_delay : u64 ,
45+ }
46+
3547/// A trigger which rolls the log once it has passed a certain time.
3648#[ derive( Debug ) ]
3749pub struct TimeTrigger {
38- /// The date/time interval between log file rolls.
39- interval : TimeTriggerInterval ,
40- /// Whether to modulate the interval.
41- modulate : bool ,
42- /// The maximum random delay in seconds.
43- max_random_delay : u64 ,
50+ config : TimeTriggerConfig ,
4451 next_roll_time : RwLock < DateTime < Local > > ,
4552 initial : Once ,
4653}
@@ -74,7 +81,7 @@ impl Default for TimeTriggerInterval {
7481
7582#[ derive( Debug , Error ) ]
7683enum TimeTrigerError {
77- #[ error( "too large interval in time trigger {0:?}" ) ]
84+ #[ error( "The integer value {0:?} for the specified time trigger interval is too large, it must be less than 9,223,372,036,854,775,807 seconds. " ) ]
7885 TooLargeInterval ( TimeTriggerInterval ) ,
7986}
8087
@@ -180,25 +187,18 @@ impl<'de> serde::Deserialize<'de> for TimeTriggerInterval {
180187impl TimeTrigger {
181188 /// Returns a new trigger which rolls the log once it has passed the
182189 /// specified time.
183- pub fn new (
184- interval : TimeTriggerInterval ,
185- modulate : bool ,
186- max_random_delay : u64 ,
187- ) -> TimeTrigger {
190+ pub fn new ( config : TimeTriggerConfig ) -> TimeTrigger {
188191 TimeTrigger {
189- interval,
190- modulate,
191- max_random_delay,
192+ config,
192193 next_roll_time : RwLock :: default ( ) ,
193194 initial : Once :: new ( ) ,
194195 }
195196 }
196197
197- fn get_next_time (
198- current : DateTime < Local > ,
199- interval : TimeTriggerInterval ,
200- modulate : bool ,
201- ) -> anyhow:: Result < DateTime < Local > > {
198+ fn get_next_time ( & self , current : DateTime < Local > ) -> Result < DateTime < Local > , TimeTrigerError > {
199+ let interval = self . config . interval ;
200+ let modulate = self . config . modulate ;
201+
202202 let year = current. year ( ) ;
203203 if let TimeTriggerInterval :: Year ( n) = interval {
204204 let n = n as i32 ;
@@ -284,7 +284,7 @@ impl TimeTrigger {
284284 panic ! ( "Should not reach here!" ) ;
285285 }
286286
287- fn refresh_time ( & self ) -> anyhow :: Result < ( ) > {
287+ fn refresh_time ( & self ) -> Result < ( ) , TimeTrigerError > {
288288 #[ cfg( test) ]
289289 let current = {
290290 let now: std:: time:: Duration = SystemTime :: now ( )
@@ -299,9 +299,9 @@ impl TimeTrigger {
299299
300300 #[ cfg( not( test) ) ]
301301 let current = Local :: now ( ) ;
302- let next_time = TimeTrigger :: get_next_time ( current, self . interval , self . modulate ) ?;
303- let next_roll_time = if self . max_random_delay > 0 {
304- let random_delay = rand:: thread_rng ( ) . gen_range ( 0 ..self . max_random_delay ) ;
302+ let next_time = self . get_next_time ( current) ?;
303+ let next_roll_time = if self . config . max_random_delay > 0 {
304+ let random_delay = rand:: thread_rng ( ) . gen_range ( 0 ..self . config . max_random_delay ) ;
305305 next_time
306306 + Duration :: try_seconds ( random_delay as i64 )
307307 . unwrap_or ( Duration :: try_milliseconds ( i64:: MAX ) . unwrap ( ) )
@@ -373,11 +373,7 @@ impl Deserialize for TimeTriggerDeserializer {
373373 config : TimeTriggerConfig ,
374374 _: & Deserializers ,
375375 ) -> anyhow:: Result < Box < dyn Trigger > > {
376- Ok ( Box :: new ( TimeTrigger :: new (
377- config. interval ,
378- config. modulate ,
379- config. max_random_delay ,
380- ) ) )
376+ Ok ( Box :: new ( TimeTrigger :: new ( config) ) )
381377 }
382378}
383379
@@ -398,8 +394,13 @@ mod test {
398394 path : file. path ( ) ,
399395 len : 0 ,
400396 } ;
397+ let config = TimeTriggerConfig {
398+ interval,
399+ modulate,
400+ max_random_delay : 0 ,
401+ } ;
401402
402- let trigger = TimeTrigger :: new ( interval , modulate , 0 ) ;
403+ let trigger = TimeTrigger :: new ( config ) ;
403404 trigger. trigger ( & logfile) . unwrap ( ) ;
404405
405406 MockClock :: advance_system_time ( Duration :: from_millis ( millis / 2 ) ) ;
@@ -531,8 +532,12 @@ mod test {
531532 path : file. path ( ) ,
532533 len : 0 ,
533534 } ;
535+ let config = TimeTriggerConfig {
536+ interval,
537+ ..Debug :: default ( )
538+ } ;
534539
535- let trigger = TimeTrigger :: new ( interval , false , 0 ) ;
540+ let trigger = TimeTrigger :: new ( config ) ;
536541 let error = trigger. trigger ( & logfile) . unwrap_err ( ) ;
537542 let box_dyn = Box :: < dyn StdError > :: from ( error) ;
538543 assert_eq ! (
@@ -543,7 +548,12 @@ mod test {
543548
544549 #[ test]
545550 fn pre_process ( ) {
546- let trigger = TimeTrigger :: new ( TimeTriggerInterval :: Minute ( 2 ) , true , 0 ) ;
551+ let config = TimeTriggerConfig {
552+ interval : TimeTriggerInterval :: Minute ( 2 ) ,
553+ modulate : true ,
554+ max_random_delay : 0 ,
555+ } ;
556+ let trigger = TimeTrigger :: new ( config) ;
547557 assert ! ( trigger. is_pre_process( ) ) ;
548558 }
549559}
0 commit comments