1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.core.rolling;
15
16 import java.io.File;
17 import java.util.Date;
18 import java.util.concurrent.Future;
19
20 import ch.qos.logback.core.CoreConstants;
21 import ch.qos.logback.core.rolling.helper.*;
22
23
24
25
26
27
28
29
30
31
32
33 public class TimeBasedRollingPolicy<E> extends RollingPolicyBase implements
34 TriggeringPolicy<E> {
35 static final String FNP_NOT_SET = "The FileNamePattern option must be set before using TimeBasedRollingPolicy. ";
36 static final int NO_DELETE_HISTORY = 0;
37
38
39 FileNamePattern fileNamePatternWCS;
40
41 private Compressor compressor;
42 private RenameUtil renameUtil = new RenameUtil();
43 Future<?> future;
44
45 private int maxHistory = NO_DELETE_HISTORY;
46 private ArchiveRemover archiveRemover;
47
48 TimeBasedFileNamingAndTriggeringPolicy<E> timeBasedFileNamingAndTriggeringPolicy;
49
50 public void start() {
51
52 renameUtil.setContext(this.context);
53
54
55 if (fileNamePatternStr != null) {
56 fileNamePattern = new FileNamePattern(fileNamePatternStr, this.context);
57 determineCompressionMode();
58 } else {
59 addWarn(FNP_NOT_SET);
60 addWarn(CoreConstants.SEE_FNP_NOT_SET);
61 throw new IllegalStateException(FNP_NOT_SET
62 + CoreConstants.SEE_FNP_NOT_SET);
63 }
64
65 compressor = new Compressor(compressionMode);
66 compressor.setContext(context);
67
68
69 fileNamePatternWCS = new FileNamePattern(Compressor.computeFileNameStr_WCS(
70 fileNamePatternStr, compressionMode), this.context);
71
72 addInfo("Will use the pattern " + fileNamePatternWCS
73 + " for the active file");
74
75 if(compressionMode == CompressionMode.ZIP) {
76 String zipEntryFileNamePatternStr = transformFileNamePattern2ZipEntry(fileNamePatternStr);
77 zipEntryFileNamePattern = new FileNamePattern(zipEntryFileNamePatternStr, context);
78 }
79
80 if (timeBasedFileNamingAndTriggeringPolicy == null) {
81 timeBasedFileNamingAndTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<E>();
82 }
83 timeBasedFileNamingAndTriggeringPolicy.setContext(context);
84 timeBasedFileNamingAndTriggeringPolicy.setTimeBasedRollingPolicy(this);
85 timeBasedFileNamingAndTriggeringPolicy.start();
86
87
88
89
90 if (maxHistory != NO_DELETE_HISTORY) {
91 archiveRemover = timeBasedFileNamingAndTriggeringPolicy.getArchiveRemover();
92 archiveRemover.setMaxHistory(maxHistory);
93 }
94
95 super.start();
96 }
97
98 private String transformFileNamePattern2ZipEntry(String fileNamePatternStr) {
99 String slashified = FileFilterUtil.slashify(fileNamePatternStr);
100 return FileFilterUtil.afterLastSlash(slashified);
101 }
102
103 public void setTimeBasedFileNamingAndTriggeringPolicy(
104 TimeBasedFileNamingAndTriggeringPolicy<E> timeBasedTriggering) {
105 this.timeBasedFileNamingAndTriggeringPolicy = timeBasedTriggering;
106 }
107
108 public TimeBasedFileNamingAndTriggeringPolicy<E> getTimeBasedFileNamingAndTriggeringPolicy() {
109 return timeBasedFileNamingAndTriggeringPolicy;
110 }
111
112 public void rollover() throws RolloverFailure {
113
114
115
116
117 String elapsedPeriodsFileName = timeBasedFileNamingAndTriggeringPolicy
118 .getElapsedPeriodsFileName();
119
120 String elpasedPeriodStem = FileFilterUtil.afterLastSlash(elapsedPeriodsFileName);
121
122
123 if (compressionMode == CompressionMode.NONE) {
124 if (getParentsRawFileProperty() != null) {
125 renameUtil.rename(getParentsRawFileProperty(), elapsedPeriodsFileName);
126 }
127 } else {
128 if (getParentsRawFileProperty() == null) {
129 future = asyncCompress(elapsedPeriodsFileName, elapsedPeriodsFileName, elpasedPeriodStem);
130 } else {
131 future = renamedRawAndAsyncCompress(elapsedPeriodsFileName, elpasedPeriodStem);
132 }
133 }
134
135 if (archiveRemover != null) {
136 archiveRemover.clean(new Date(timeBasedFileNamingAndTriggeringPolicy.getCurrentTime()));
137 }
138 }
139
140 Future asyncCompress(String nameOfFile2Compress, String nameOfCompressedFile, String innerEntryName)
141 throws RolloverFailure {
142 AsynchronousCompressor ac = new AsynchronousCompressor(compressor);
143 return ac.compressAsynchronously(nameOfFile2Compress, nameOfCompressedFile, innerEntryName);
144 }
145
146 Future renamedRawAndAsyncCompress(String nameOfCompressedFile, String innerEntryName)
147 throws RolloverFailure {
148 String parentsRawFile = getParentsRawFileProperty();
149 String tmpTarget = parentsRawFile + System.nanoTime() + ".tmp";
150 renameUtil.rename(parentsRawFile, tmpTarget);
151 return asyncCompress(tmpTarget, nameOfCompressedFile, innerEntryName);
152 }
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174 public String getActiveFileName() {
175 String parentsRawFileProperty = getParentsRawFileProperty();
176 if (parentsRawFileProperty != null) {
177 return parentsRawFileProperty;
178 } else {
179 return timeBasedFileNamingAndTriggeringPolicy
180 .getCurrentPeriodsFileNameWithoutCompressionSuffix();
181 }
182 }
183
184 public boolean isTriggeringEvent(File activeFile, final E event) {
185 return timeBasedFileNamingAndTriggeringPolicy.isTriggeringEvent(activeFile, event);
186 }
187
188
189
190
191
192
193 public int getMaxHistory() {
194 return maxHistory;
195 }
196
197
198
199
200
201
202
203 public void setMaxHistory(int maxHistory) {
204 this.maxHistory = maxHistory;
205 }
206
207 @Override
208 public String toString() {
209 return "c.q.l.core.rolling.TimeBasedRollingPolicy";
210 }
211 }