Skip to content

Commit c0205cd

Browse files
committed
feat!(trigger): add support for CompositeTrigger
1 parent b0ad8ba commit c0205cd

5 files changed

Lines changed: 58 additions & 47 deletions

File tree

benches/rotation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ fn mk_config(file_size: u64, file_count: u32) -> log4rs::config::Config {
7575
let roller = policy::compound::roll::fixed_window::FixedWindowRoller::builder()
7676
.build(&roll_pattern, file_count)
7777
.unwrap();
78-
let policy = policy::compound::CompoundPolicy::new(Box::new(trigger), Box::new(roller));
78+
let policy = policy::compound::CompoundPolicy::new(vec![Box::new(trigger)], Box::new(roller));
7979
let file = RollingFileAppender::builder()
8080
.encoder(Box::new(PatternEncoder::new(
8181
"{d(%Y-%m-%d %H:%M:%S.%3f %Z)} {l} [{t} - {T}] {m}{n}",

docs/Configuration.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,9 @@ my_rolling_appender:
158158
path: "logs/test.log"
159159
policy:
160160
kind: compound
161-
trigger:
162-
kind: size
163-
limit: 1mb
161+
triggers:
162+
- kind: size
163+
limit: 1mb
164164
roller:
165165
kind: fixed_window
166166
base: 1
@@ -171,7 +171,7 @@ my_rolling_appender:
171171
The new component is the _policy_ field. A policy must have `kind` like most
172172
other components, the default (and only supported) policy is `kind: compound`.
173173

174-
The _trigger_ field is used to dictate when the log file should be rolled. The
174+
The _triggers_ field is used to dictate when the log file should be rolled. The
175175
only supported trigger is `kind: size`. There is a required field `limit`
176176
which defines the maximum file size prior to a rolling of the file. The limit
177177
field requires one of the following units in bytes, case does not matter:
@@ -185,9 +185,9 @@ field requires one of the following units in bytes, case does not matter:
185185
i.e.
186186

187187
```yml
188-
trigger:
189-
kind: size
190-
limit: 10 mb
188+
triggers:
189+
- kind: size
190+
limit: 10 mb
191191
```
192192

193193
The _roller_ field supports two types: delete, and fixed_window. The delete

src/append/rolling_file/mod.rs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,9 @@ impl RollingFileAppenderBuilder {
309309
///
310310
/// # The remainder of the configuration is passed along to the policy's
311311
/// # deserializer, and will vary based on the kind of policy.
312-
/// trigger:
313-
/// kind: size
314-
/// limit: 10 mb
312+
/// triggers:
313+
/// - kind: size
314+
/// limit: 10 mb
315315
///
316316
/// roller:
317317
/// kind: delete
@@ -366,28 +366,28 @@ mod test {
366366
let config = format!(
367367
"
368368
appenders:
369-
foo:
370-
kind: rolling_file
371-
path: {0}/foo.log
372-
policy:
373-
trigger:
374-
kind: size
375-
limit: 1024
376-
roller:
377-
kind: delete
378-
bar:
379-
kind: rolling_file
380-
path: {0}/foo.log
381-
policy:
382-
kind: compound
383-
trigger:
384-
kind: size
385-
limit: 5 mb
386-
roller:
387-
kind: fixed_window
388-
pattern: '{0}/foo.log.{{}}'
389-
base: 1
390-
count: 5
369+
foo:
370+
kind: rolling_file
371+
path: {0}/foo.log
372+
policy:
373+
triggers:
374+
- kind: size
375+
limit: 1024
376+
roller:
377+
kind: delete
378+
bar:
379+
kind: rolling_file
380+
path: {0}/foo.log
381+
policy:
382+
kind: compound
383+
triggers:
384+
- kind: size
385+
limit: 5 mb
386+
roller:
387+
kind: fixed_window
388+
pattern: '{0}/foo.log.{{}}'
389+
base: 1
390+
count: 5
391391
",
392392
dir.path().display()
393393
);

src/append/rolling_file/policy/compound/mod.rs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub mod trigger;
2323
#[derive(Clone, Eq, PartialEq, Hash, Debug, serde::Deserialize)]
2424
#[serde(deny_unknown_fields)]
2525
pub 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)]
9090
pub struct CompoundPolicy {
91-
trigger: Box<dyn trigger::Trigger>,
91+
triggers: Vec<Box<dyn trigger::Trigger>>,
9292
roller: Box<dyn Roll>,
9393
}
9494

9595
impl 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

102102
impl 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
}

src/append/rolling_file/policy/compound/trigger/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ pub trait Trigger: fmt::Debug + Send + Sync + 'static {
1818
#[cfg(feature = "config_parsing")]
1919
impl Deserializable for dyn Trigger {
2020
fn name() -> &'static str {
21-
"trigger"
21+
"triggers"
2222
}
2323
}

0 commit comments

Comments
 (0)