org.apache.log4j
public class: DailyRollingFileAppender [javadoc |
source]
java.lang.Object
org.apache.log4j.AppenderSkeleton
org.apache.log4j.WriterAppender
org.apache.log4j.FileAppender
org.apache.log4j.DailyRollingFileAppender
All Implemented Interfaces:
OptionHandler, Appender
DailyRollingFileAppender extends
FileAppender so that the
underlying file is rolled over at a user chosen frequency.
The rolling schedule is specified by the DatePattern
option. This pattern should follow the SimpleDateFormat
conventions. In particular, you must escape literal text
within a pair of single quotes. A formatted version of the date
pattern is used as the suffix for the rolled file name.
For example, if the File option is set to
/foo/bar.log and the DatePattern set to
'.'yyyy-MM-dd, on 2001-02-16 at midnight, the logging
file /foo/bar.log will be copied to
/foo/bar.log.2001-02-16 and logging for 2001-02-17
will continue in /foo/bar.log until it rolls over
the next day.
Is is possible to specify monthly, weekly, half-daily, daily,
hourly, or minutely rollover schedules.
| DatePattern |
Rollover schedule |
Example |
'.'yyyy-MM
| Rollover at the beginning of each month |
At midnight of May 31st, 2002 /foo/bar.log will be
copied to /foo/bar.log.2002-05. Logging for the month
of June will be output to /foo/bar.log until it is
also rolled over the next month.
|
'.'yyyy-ww
| Rollover at the first day of each week. The first day of the
week depends on the locale. |
Assuming the first day of the week is Sunday, on Saturday
midnight, June 9th 2002, the file /foo/bar.log will be
copied to /foo/bar.log.2002-23. Logging for the 24th week
of 2002 will be output to /foo/bar.log until it is
rolled over the next week.
|
'.'yyyy-MM-dd
| Rollover at midnight each day. |
At midnight, on March 8th, 2002, /foo/bar.log will
be copied to /foo/bar.log.2002-03-08. Logging for the
9th day of March will be output to /foo/bar.log until
it is rolled over the next day.
|
'.'yyyy-MM-dd-a
| Rollover at midnight and midday of each day. |
At noon, on March 9th, 2002, /foo/bar.log will be
copied to /foo/bar.log.2002-03-09-AM. Logging for the
afternoon of the 9th will be output to /foo/bar.log
until it is rolled over at midnight.
|
'.'yyyy-MM-dd-HH
| Rollover at the top of every hour. |
At approximately 11:00.000 o'clock on March 9th, 2002,
/foo/bar.log will be copied to
/foo/bar.log.2002-03-09-10. Logging for the 11th hour
of the 9th of March will be output to /foo/bar.log
until it is rolled over at the beginning of the next hour.
|
'.'yyyy-MM-dd-HH-mm
| Rollover at the beginning of every minute. |
At approximately 11:23,000, on March 9th, 2001,
/foo/bar.log will be copied to
/foo/bar.log.2001-03-09-10-22. Logging for the minute
of 11:23 (9th of March) will be output to
/foo/bar.log until it is rolled over the next minute.
|
Do not use the colon ":" character in anywhere in the
DatePattern option. The text before the colon is interpeted
as the protocol specificaion of a URL which is probably not what
you want.
- author:
Eirik - Lygre
- author:
Ceki - Gülcü
| Field Summary |
|---|
| static final int | TOP_OF_TROUBLE | |
| static final int | TOP_OF_MINUTE | |
| static final int | TOP_OF_HOUR | |
| static final int | HALF_DAY | |
| static final int | TOP_OF_DAY | |
| static final int | TOP_OF_WEEK | |
| static final int | TOP_OF_MONTH | |
| Date | now | |
| SimpleDateFormat | sdf | |
| RollingCalendar | rc | |
| int | checkPeriod | |
| static final TimeZone | gmtTimeZone | |
| Methods from org.apache.log4j.FileAppender: |
|---|
|
activateOptions, closeFile, getAppend, getBufferSize, getBufferedIO, getFile, reset, setAppend, setBufferSize, setBufferedIO, setFile, setFile, setQWForFiles |
| Methods from org.apache.log4j.WriterAppender: |
|---|
|
activateOptions, append, checkEntryConditions, close, closeWriter, createWriter, getEncoding, getImmediateFlush, requiresLayout, reset, setEncoding, setErrorHandler, setImmediateFlush, setWriter, subAppend, writeFooter, writeHeader |
| Methods from org.apache.log4j.AppenderSkeleton: |
|---|
|
activateOptions, addFilter, append, clearFilters, doAppend, finalize, getErrorHandler, getFilter, getFirstFilter, getLayout, getName, getThreshold, isAsSevereAsThreshold, setErrorHandler, setLayout, setName, setThreshold |
| Method from org.apache.log4j.DailyRollingFileAppender Detail: |
public void activateOptions() {
super.activateOptions();
if(datePattern != null && fileName != null) {
now.setTime(System.currentTimeMillis());
sdf = new SimpleDateFormat(datePattern);
int type = computeCheckPeriod();
printPeriodicity(type);
rc.setType(type);
File file = new File(fileName);
scheduledFilename = fileName+sdf.format(new Date(file.lastModified()));
} else {
LogLog.error("Either File or DatePattern options are not set for appender ["
+name+"].");
}
}
|
int computeCheckPeriod() {
RollingCalendar rollingCalendar = new RollingCalendar(gmtTimeZone, Locale.ENGLISH);
// set sate to 1970-01-01 00:00:00 GMT
Date epoch = new Date(0);
if(datePattern != null) {
for(int i = TOP_OF_MINUTE; i < = TOP_OF_MONTH; i++) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);
simpleDateFormat.setTimeZone(gmtTimeZone); // do all date formatting in GMT
String r0 = simpleDateFormat.format(epoch);
rollingCalendar.setType(i);
Date next = new Date(rollingCalendar.getNextCheckMillis(epoch));
String r1 = simpleDateFormat.format(next);
//System.out.println("Type = "+i+", r0 = "+r0+", r1 = "+r1);
if(r0 != null && r1 != null && !r0.equals(r1)) {
return i;
}
}
}
return TOP_OF_TROUBLE; // Deliberately head for trouble...
}
|
public String getDatePattern() {
return datePattern;
}
Returns the value of the DatePattern option. |
void printPeriodicity(int type) {
switch(type) {
case TOP_OF_MINUTE:
LogLog.debug("Appender ["+name+"] to be rolled every minute.");
break;
case TOP_OF_HOUR:
LogLog.debug("Appender ["+name
+"] to be rolled on top of every hour.");
break;
case HALF_DAY:
LogLog.debug("Appender ["+name
+"] to be rolled at midday and midnight.");
break;
case TOP_OF_DAY:
LogLog.debug("Appender ["+name
+"] to be rolled at midnight.");
break;
case TOP_OF_WEEK:
LogLog.debug("Appender ["+name
+"] to be rolled at start of week.");
break;
case TOP_OF_MONTH:
LogLog.debug("Appender ["+name
+"] to be rolled at start of every month.");
break;
default:
LogLog.warn("Unknown periodicity for appender ["+name+"].");
}
}
|
void rollOver() throws IOException {
/* Compute filename, but only if datePattern is specified */
if (datePattern == null) {
errorHandler.error("Missing DatePattern option in rollOver().");
return;
}
String datedFilename = fileName+sdf.format(now);
// It is too early to roll over because we are still within the
// bounds of the current interval. Rollover will occur once the
// next interval is reached.
if (scheduledFilename.equals(datedFilename)) {
return;
}
// close current file, and rename it to datedFilename
this.closeFile();
File target = new File(scheduledFilename);
if (target.exists()) {
target.delete();
}
File file = new File(fileName);
boolean result = file.renameTo(target);
if(result) {
LogLog.debug(fileName +" - > "+ scheduledFilename);
} else {
LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");
}
try {
// This will also close the file. This is OK since multiple
// close operations are safe.
this.setFile(fileName, false, this.bufferedIO, this.bufferSize);
}
catch(IOException e) {
errorHandler.error("setFile("+fileName+", false) call failed.");
}
scheduledFilename = datedFilename;
}
Rollover the current file to a new file. |
public void setDatePattern(String pattern) {
datePattern = pattern;
}
The DatePattern takes a string in the same format as
expected by SimpleDateFormat . This options determines the
rollover schedule. |
protected void subAppend(LoggingEvent event) {
long n = System.currentTimeMillis();
if (n >= nextCheck) {
now.setTime(n);
nextCheck = rc.getNextCheckMillis(now);
try {
rollOver();
}
catch(IOException ioe) {
LogLog.error("rollOver() failed.", ioe);
}
}
super.subAppend(event);
}
This method differentiates DailyRollingFileAppender from its
super class.
Before actually logging, this method will check whether it is
time to do a rollover. If it is, it will schedule the next
rollover time and then rollover. |