1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender.rolling;
18
19 import java.text.ParseException;
20 import java.util.Calendar;
21 import java.util.Date;
22 import java.util.concurrent.TimeUnit;
23
24 import org.apache.logging.log4j.core.LogEvent;
25 import org.apache.logging.log4j.core.config.Configuration;
26 import org.apache.logging.log4j.core.config.CronScheduledFuture;
27 import org.apache.logging.log4j.core.config.Scheduled;
28 import org.apache.logging.log4j.core.config.plugins.Plugin;
29 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
30 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
31 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
32 import org.apache.logging.log4j.core.util.CronExpression;
33
34
35
36
37 @Plugin(name = "CronTriggeringPolicy", category = "Core", printObject = true)
38 @Scheduled
39 public final class CronTriggeringPolicy extends AbstractTriggeringPolicy {
40
41 private static final String defaultSchedule = "0 0 0 * * ?";
42 private RollingFileManager manager;
43 private final CronExpression cronExpression;
44 private final Configuration configuration;
45 private final boolean checkOnStartup;
46 private volatile Date nextRollDate;
47 private CronScheduledFuture<?> future;
48
49 private CronTriggeringPolicy(final CronExpression schedule, final boolean checkOnStartup,
50 final Configuration configuration) {
51 this.cronExpression = schedule;
52 this.configuration = configuration;
53 this.checkOnStartup = checkOnStartup;
54 }
55
56
57
58
59
60
61
62 @Override
63 public void initialize(final RollingFileManager aManager) {
64 this.manager = aManager;
65 final Date nextDate = new Date(this.manager.getFileTime());
66 nextRollDate = cronExpression.getNextValidTimeAfter(nextDate);
67 if (checkOnStartup) {
68 if (nextRollDate.getTime() < System.currentTimeMillis()) {
69 rollover();
70 }
71 }
72 future = configuration.getScheduler().scheduleWithCron(cronExpression, new CronTrigger());
73 }
74
75
76
77
78
79
80
81
82 @Override
83 public boolean isTriggeringEvent(final LogEvent event) {
84 return false;
85 }
86
87 public CronExpression getCronExpression() {
88 return cronExpression;
89 }
90
91
92
93
94
95
96
97
98
99
100
101
102 @PluginFactory
103 public static CronTriggeringPolicy createPolicy(@PluginConfiguration final Configuration configuration,
104 @PluginAttribute("evaluateOnStartup") final String evaluateOnStartup,
105 @PluginAttribute("schedule") final String schedule) {
106 CronExpression cronExpression;
107 final boolean checkOnStartup = Boolean.parseBoolean(evaluateOnStartup);
108 if (schedule == null) {
109 LOGGER.info("No schedule specified, defaulting to Daily");
110 cronExpression = getSchedule(defaultSchedule);
111 } else {
112 cronExpression = getSchedule(schedule);
113 if (cronExpression == null) {
114 LOGGER.error("Invalid expression specified. Defaulting to Daily");
115 cronExpression = getSchedule(defaultSchedule);
116 }
117 }
118 return new CronTriggeringPolicy(cronExpression, checkOnStartup, configuration);
119 }
120
121 private static CronExpression getSchedule(final String expression) {
122 try {
123 return new CronExpression(expression);
124 } catch (final ParseException pe) {
125 LOGGER.error("Invalid cron expression - " + expression, pe);
126 return null;
127 }
128 }
129
130 private void rollover() {
131 manager.getPatternProcessor().setPrevFileTime(nextRollDate.getTime());
132 manager.rollover();
133 final Date fireDate = future.getFireTime();
134 final Calendar cal = Calendar.getInstance();
135 cal.setTime(fireDate);
136 cal.add(Calendar.SECOND, -1);
137 nextRollDate = cal.getTime();
138 }
139
140 @Override
141 public boolean stop(final long timeout, final TimeUnit timeUnit) {
142 setStopping();
143 final boolean stopped = stop(future);
144 setStopped();
145 return stopped;
146 }
147
148 @Override
149 public String toString() {
150 return "CronTriggeringPolicy(schedule=" + cronExpression.getCronExpression() + ")";
151 }
152
153 private class CronTrigger implements Runnable {
154
155 @Override
156 public void run() {
157 rollover();
158 }
159 }
160 }