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 org.apache.logging.log4j.Logger;
20 import org.apache.logging.log4j.core.LogEvent;
21 import org.apache.logging.log4j.core.config.Configuration;
22 import org.apache.logging.log4j.core.config.Scheduled;
23 import org.apache.logging.log4j.core.config.plugins.Plugin;
24 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
25 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
26 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
27 import org.apache.logging.log4j.core.util.CronExpression;
28 import org.apache.logging.log4j.status.StatusLogger;
29
30 import java.text.ParseException;
31 import java.util.Date;
32
33
34
35
36 @Plugin(name = "CronTriggeringPolicy", category = "Core", printObject = true)
37 @Scheduled
38 public final class CronTriggeringPolicy implements TriggeringPolicy {
39
40 private static Logger LOGGER = StatusLogger.getLogger();
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
47 private CronTriggeringPolicy(CronExpression schedule, boolean checkOnStartup, Configuration configuration) {
48 this.cronExpression = schedule;
49 this.configuration = configuration;
50 this.checkOnStartup = checkOnStartup;
51 }
52
53
54
55
56
57 @Override
58 public void initialize(final RollingFileManager aManager) {
59 this.manager = aManager;
60 if (checkOnStartup) {
61 Date nextDate = cronExpression.getNextValidTimeAfter(new Date(this.manager.getFileTime()));
62 if (nextDate.getTime() < System.currentTimeMillis()) {
63 manager.rollover();
64 }
65 }
66 configuration.getScheduler().scheduleWithCron(cronExpression, new CronTrigger());
67 }
68
69
70
71
72
73
74 @Override
75 public boolean isTriggeringEvent(final LogEvent event) {
76 return false;
77 }
78
79 public CronExpression getCronExpression() {
80 return cronExpression;
81 }
82
83
84
85
86
87
88
89
90 @PluginFactory
91 public static CronTriggeringPolicy createPolicy(
92 @PluginConfiguration Configuration configuration,
93 @PluginAttribute("evaluateOnStartup") final String evaluateOnStartup,
94 @PluginAttribute("schedule") final String schedule) {
95 CronExpression cronExpression;
96 final boolean checkOnStartup = Boolean.parseBoolean(evaluateOnStartup);
97 if (schedule == null) {
98 LOGGER.info("No schedule specified, defaulting to Daily");
99 cronExpression = getSchedule(defaultSchedule);
100 } else {
101 cronExpression = getSchedule(schedule);
102 if (cronExpression == null) {
103 LOGGER.error("Invalid expression specified. Defaulting to Daily");
104 cronExpression = getSchedule(defaultSchedule);
105 }
106 }
107 return new CronTriggeringPolicy(cronExpression, checkOnStartup, configuration);
108 }
109
110 private static CronExpression getSchedule(String expression) {
111 try {
112 return new CronExpression(expression);
113 } catch (ParseException pe) {
114 LOGGER.error("Invalid cron expression - " + expression, pe);
115 return null;
116 }
117 }
118
119 @Override
120 public String toString() {
121 return "CronTriggeringPolicy(schedule=" + cronExpression.getCronExpression() + ")";
122 }
123
124 private class CronTrigger implements Runnable {
125
126 public void run() {
127 manager.rollover();
128 }
129 }
130
131 }