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.Date;
21 import java.util.Objects;
22 import java.util.concurrent.TimeUnit;
23
24 import org.apache.logging.log4j.core.Core;
25 import org.apache.logging.log4j.core.LogEvent;
26 import org.apache.logging.log4j.core.config.Configuration;
27 import org.apache.logging.log4j.core.config.ConfigurationScheduler;
28 import org.apache.logging.log4j.core.config.CronScheduledFuture;
29 import org.apache.logging.log4j.core.config.Scheduled;
30 import org.apache.logging.log4j.core.config.plugins.Plugin;
31 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
32 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
33 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
34 import org.apache.logging.log4j.core.util.CronExpression;
35
36
37
38
39 @Plugin(name = "CronTriggeringPolicy", category = Core.CATEGORY_NAME, printObject = true)
40 @Scheduled
41 public final class CronTriggeringPolicy extends AbstractTriggeringPolicy {
42
43 private static final String defaultSchedule = "0 0 0 * * ?";
44 private RollingFileManager manager;
45 private final CronExpression cronExpression;
46 private final Configuration configuration;
47 private final boolean checkOnStartup;
48 private volatile Date lastRollDate;
49 private CronScheduledFuture<?> future;
50
51 private CronTriggeringPolicy(final CronExpression schedule, final boolean checkOnStartup,
52 final Configuration configuration) {
53 this.cronExpression = Objects.requireNonNull(schedule, "schedule");
54 this.configuration = Objects.requireNonNull(configuration, "configuration");
55 this.checkOnStartup = checkOnStartup;
56 }
57
58
59
60
61
62
63
64 @Override
65 public void initialize(final RollingFileManager aManager) {
66 this.manager = aManager;
67 final Date now = new Date();
68 final Date lastRollForFile = cronExpression.getPrevFireTime(new Date(this.manager.getFileTime()));
69 final Date lastRegularRoll = cronExpression.getPrevFireTime(new Date());
70 aManager.getPatternProcessor().setCurrentFileTime(lastRegularRoll.getTime());
71 LOGGER.debug("LastRollForFile {}, LastRegularRole {}", lastRollForFile, lastRegularRoll);
72 aManager.getPatternProcessor().setPrevFileTime(lastRegularRoll.getTime());
73 if (checkOnStartup && lastRollForFile != null && lastRegularRoll != null &&
74 lastRollForFile.before(lastRegularRoll)) {
75 lastRollDate = lastRollForFile;
76 rollover();
77 }
78
79 final ConfigurationScheduler scheduler = configuration.getScheduler();
80 if (!scheduler.isExecutorServiceSet()) {
81
82 scheduler.incrementScheduledItems();
83 }
84 if (!scheduler.isStarted()) {
85 scheduler.start();
86 }
87 lastRollDate = lastRegularRoll;
88 future = scheduler.scheduleWithCron(cronExpression, now, new CronTrigger());
89 LOGGER.debug(scheduler.toString());
90 }
91
92
93
94
95
96
97
98
99 @Override
100 public boolean isTriggeringEvent(final LogEvent event) {
101 return false;
102 }
103
104 public CronExpression getCronExpression() {
105 return cronExpression;
106 }
107
108
109
110
111
112
113
114
115
116
117
118
119 @PluginFactory
120 public static CronTriggeringPolicy createPolicy(@PluginConfiguration final Configuration configuration,
121 @PluginAttribute("evaluateOnStartup") final String evaluateOnStartup,
122 @PluginAttribute("schedule") final String schedule) {
123 CronExpression cronExpression;
124 final boolean checkOnStartup = Boolean.parseBoolean(evaluateOnStartup);
125 if (schedule == null) {
126 LOGGER.info("No schedule specified, defaulting to Daily");
127 cronExpression = getSchedule(defaultSchedule);
128 } else {
129 cronExpression = getSchedule(schedule);
130 if (cronExpression == null) {
131 LOGGER.error("Invalid expression specified. Defaulting to Daily");
132 cronExpression = getSchedule(defaultSchedule);
133 }
134 }
135 return new CronTriggeringPolicy(cronExpression, checkOnStartup, configuration);
136 }
137
138 private static CronExpression getSchedule(final String expression) {
139 try {
140 return new CronExpression(expression);
141 } catch (final ParseException pe) {
142 LOGGER.error("Invalid cron expression - " + expression, pe);
143 return null;
144 }
145 }
146
147 private void rollover() {
148 manager.getPatternProcessor().setPrevFileTime(lastRollDate.getTime());
149 final Date thisRoll = cronExpression.getPrevFireTime(new Date());
150 manager.getPatternProcessor().setCurrentFileTime(thisRoll.getTime());
151 manager.rollover();
152 if (future != null) {
153 lastRollDate = future.getFireTime();
154 }
155 }
156
157 @Override
158 public boolean stop(final long timeout, final TimeUnit timeUnit) {
159 setStopping();
160 final boolean stopped = stop(future);
161 setStopped();
162 return stopped;
163 }
164
165 @Override
166 public String toString() {
167 return "CronTriggeringPolicy(schedule=" + cronExpression.getCronExpression() + ")";
168 }
169
170 private class CronTrigger implements Runnable {
171
172 @Override
173 public void run() {
174 rollover();
175 }
176 }
177 }