@@ -23,7 +23,7 @@ pub mod trigger;
2323#[ derive( Clone , Eq , PartialEq , Hash , Debug , serde:: Deserialize ) ]
2424#[ serde( deny_unknown_fields) ]
2525pub struct CompoundPolicyConfig {
26- trigger : Trigger ,
26+ triggers : Vec < Trigger > ,
2727 roller : Roller ,
2828}
2929
@@ -81,27 +81,33 @@ impl<'de> serde::Deserialize<'de> for Roller {
8181 }
8282}
8383
84- /// A rolling policy which delegates to a "trigger " and "roller".
84+ /// A rolling policy which delegates to a "triggers " and "roller".
8585///
8686/// The trigger determines if the log file should roll, for example, by checking
8787/// the size of the file. The roller processes the old log file, for example,
8888/// by compressing it and moving it to a different location.
8989#[ derive( Debug ) ]
9090pub struct CompoundPolicy {
91- trigger : Box < dyn trigger:: Trigger > ,
91+ triggers : Vec < Box < dyn trigger:: Trigger > > ,
9292 roller : Box < dyn Roll > ,
9393}
9494
9595impl CompoundPolicy {
9696 /// Creates a new `CompoundPolicy`.
97- pub fn new ( trigger : Box < dyn trigger:: Trigger > , roller : Box < dyn Roll > ) -> CompoundPolicy {
98- CompoundPolicy { trigger , roller }
97+ pub fn new ( triggers : Vec < Box < dyn trigger:: Trigger > > , roller : Box < dyn Roll > ) -> CompoundPolicy {
98+ CompoundPolicy { triggers , roller }
9999 }
100100}
101101
102102impl Policy for CompoundPolicy {
103103 fn process ( & self , log : & mut LogFile ) -> anyhow:: Result < ( ) > {
104- if self . trigger . trigger ( log) ? {
104+ let mut is_trigger = false ;
105+ for trigger in & self . triggers {
106+ if trigger. trigger ( log) ? {
107+ is_trigger = true ;
108+ }
109+ }
110+ if is_trigger {
105111 log. roll ( ) ;
106112 self . roller . roll ( log. path ( ) ) ?;
107113 }
@@ -117,14 +123,14 @@ impl Policy for CompoundPolicy {
117123/// kind: compound
118124///
119125/// # The trigger, which determines when the log will roll over. Required.
120- /// trigger :
126+ /// triggers :
121127///
122128/// # Identifies which trigger is to be used. Required.
123- /// kind: size
129+ /// - kind: size
124130///
125- /// # The remainder of the configuration is passed to the trigger's
126- /// # deserializer, and will vary based on the kind of trigger.
127- /// limit: 10 mb
131+ /// # The remainder of the configuration is passed to the trigger's
132+ /// # deserializer, and will vary based on the kind of trigger.
133+ /// limit: 10 mb
128134///
129135/// # The roller, which processes the old log file. Required.
130136/// roller:
@@ -150,8 +156,13 @@ impl Deserialize for CompoundPolicyDeserializer {
150156 config : CompoundPolicyConfig ,
151157 deserializers : & Deserializers ,
152158 ) -> anyhow:: Result < Box < dyn Policy > > {
153- let trigger = deserializers. deserialize ( & config. trigger . kind , config. trigger . config ) ?;
159+ let mut triggers = Vec :: new ( ) ;
160+ for config_trigger in & config. triggers {
161+ let trigger =
162+ deserializers. deserialize ( & config_trigger. kind , config_trigger. config . clone ( ) ) ?;
163+ triggers. push ( trigger) ;
164+ }
154165 let roller = deserializers. deserialize ( & config. roller . kind , config. roller . config ) ?;
155- Ok ( Box :: new ( CompoundPolicy :: new ( trigger , roller) ) )
166+ Ok ( Box :: new ( CompoundPolicy :: new ( triggers , roller) ) )
156167 }
157168}
0 commit comments