You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by ce...@apache.org on 2004/05/28 19:16:43 UTC
cvs commit: logging-log4j/src/java/org/apache/log4j WriterAppender.java Layout.java FileAppender.java RollingFileAppender.java
ceki 2004/05/28 10:16:43
Modified: tests/src/java/org/apache/log4j/rolling
TimeBasedRollingTest.java
src/java/org/apache/log4j/rolling RollingFileAppender.java
src/java/org/apache/log4j WriterAppender.java Layout.java
FileAppender.java RollingFileAppender.java
Log:
Simplified the actions taken when closing. This ensures that layout
header and footer are written even in case of rolling files.
This partially fixes bug 11446.
However, in case a file is opened and closed multiple times, the header
and footer get written multiple times as well.
Revision Changes Path
1.6 +15 -12 logging-log4j/tests/src/java/org/apache/log4j/rolling/TimeBasedRollingTest.java
Index: TimeBasedRollingTest.java
===================================================================
RCS file: /home/cvs/logging-log4j/tests/src/java/org/apache/log4j/rolling/TimeBasedRollingTest.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TimeBasedRollingTest.java 27 Feb 2004 16:47:36 -0000 1.5
+++ TimeBasedRollingTest.java 28 May 2004 17:16:42 -0000 1.6
@@ -1,12 +1,12 @@
/*
* Copyright 1999,2004 The Apache Software Foundation.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -257,8 +257,9 @@
filenames[i] = "output/test5-" + sdf.format(cal.getTime());
cal.add(Calendar.SECOND, 1);
}
+
filenames[3] = "output/test5.log";
-
+
root.debug("Waiting until next second and 100 millis.");
delayUntilNextSecond(100);
root.debug("Done waiting.");
@@ -275,7 +276,7 @@
/**
* With compression, no stop/restart, activeFileName set
- *
+ *
* The test is a regression test. It logs a few times using a RollingFileAppender.
* It predicts the names of the files which will be generated and
* compares them with witness files.
@@ -297,11 +298,13 @@
SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
String[] filenames = new String[4];
- Calendar cal = Calendar.getInstance();
+ Calendar cal = Calendar.getInstance();
+
for (int i = 0; i < 3; i++) {
filenames[i] = "output/test6-" + sdf.format(cal.getTime()) + ".gz";
cal.add(Calendar.SECOND, 1);
}
+
filenames[3] = "output/test6.log";
root.debug("Waiting until next second and 100 millis.");
@@ -320,14 +323,14 @@
for (int i = 0; i < 3; i++) {
Compare.gzCompare(filenames[i], "witness/tbr-test6." + i + ".gz");
}
+
Compare.compare(filenames[3], "witness/tbr-test6.3");
}
-
-
+
void delayUntilNextSecond(int millis) {
long now = System.currentTimeMillis();
Calendar cal = Calendar.getInstance();
- cal.setTime(new Date(now));
+ cal.setTime(new Date(now));
cal.set(Calendar.MILLISECOND, millis);
cal.add(Calendar.SECOND, 1);
@@ -343,12 +346,12 @@
void delayUntilNextMinute(int seconds) {
long now = System.currentTimeMillis();
Calendar cal = Calendar.getInstance();
- cal.setTime(new Date(now));
+ cal.setTime(new Date(now));
cal.set(Calendar.SECOND, seconds);
cal.add(Calendar.MINUTE, 1);
- long next = cal.getTime().getTime();
+ long next = cal.getTime().getTime();
try {
Thread.sleep(next - now);
@@ -363,7 +366,7 @@
suite.addTest(new TimeBasedRollingTest("test2"));
suite.addTest(new TimeBasedRollingTest("test3"));
suite.addTest(new TimeBasedRollingTest("test4"));
-
+
suite.addTest(new TimeBasedRollingTest("test5"));
suite.addTest(new TimeBasedRollingTest("test6"));
1.15 +1 -1 logging-log4j/src/java/org/apache/log4j/rolling/RollingFileAppender.java
Index: RollingFileAppender.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/rolling/RollingFileAppender.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- RollingFileAppender.java 27 Feb 2004 16:47:33 -0000 1.14
+++ RollingFileAppender.java 28 May 2004 17:16:43 -0000 1.15
@@ -86,7 +86,7 @@
public void rollover() {
// Note: synchronization not necessary since doAppend is already synched
// make sure to close the hereto active log file!!
- this.closeFile();
+ this.closeWriter();
rollingPolicy.rollover();
1.27 +29 -22 logging-log4j/src/java/org/apache/log4j/WriterAppender.java
Index: WriterAppender.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/WriterAppender.java,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- WriterAppender.java 27 Feb 2004 16:47:28 -0000 1.26
+++ WriterAppender.java 28 May 2004 17:16:43 -0000 1.27
@@ -192,23 +192,26 @@
}
this.closed = true;
- writeFooter();
- reset();
+ closeWriter();
}
/**
* Close the underlying {@link java.io.Writer}.
* */
protected void closeWriter() {
- if (qw != null) {
+ if (this.qw != null) {
try {
+ // before closing we have to output out layout's footer
+ writeFooter();
qw.close();
+ this.qw = null;
} catch (IOException e) {
// There is do need to invoke an error handler at this late
// stage.
LogLog.error("Could not close " + qw, e);
}
}
+
}
/**
@@ -274,7 +277,9 @@
<p>
@param writer An already opened Writer. */
public synchronized void setWriter(Writer writer) {
- reset();
+ // close any previously opened writer
+ closeWriter();
+
this.qw = new QuietWriter(writer, errorHandler);
//this.tp = new TracerPrintWriter(qw);
@@ -282,12 +287,12 @@
}
/**
- Actual writing occurs here.
-
- <p>Most subclasses of <code>WriterAppender</code> will need to
- override this method.
-
- @since 0.9.0 */
+ * Actual writing occurs here.
+ * <p>Most subclasses of <code>WriterAppender</code> will need to override
+ * this method.
+ *
+ * @since 0.9.0
+ * */
protected void subAppend(LoggingEvent event) {
this.qw.write(this.layout.format(event));
@@ -318,20 +323,21 @@
}
/**
- Clear internal references to the writer and other variables.
-
- Subclasses can override this method for an alternate closing
- behavior. */
- protected void reset() {
+ * Clear internal references to the writer and other variables.
+ *
+ * Subclasses can override this method for an alternate closing
+ * behavior.
+ *
+ * @deprecated Use {@link #closeWriter} method instead.
+ * */
+ protected void xreset() {
closeWriter();
- this.qw = null;
-
- //this.tp = null;
}
/**
- Write a footer as produced by the embedded layout's {@link
- Layout#getFooter} method. */
+ * Write a footer as produced by the embedded layout's {@link
+ * Layout#getFooter} method.
+ * */
protected void writeFooter() {
if (layout != null) {
String f = layout.getFooter();
@@ -344,8 +350,9 @@
}
/**
- Write a header as produced by the embedded layout's {@link
- Layout#getHeader} method. */
+ * Write a header as produced by the embedded layout's {@link
+ * Layout#getHeader} method.
+ * */
protected void writeHeader() {
if (layout != null) {
String h = layout.getHeader();
1.10 +38 -9 logging-log4j/src/java/org/apache/log4j/Layout.java
Index: Layout.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/Layout.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Layout.java 27 Feb 2004 16:47:28 -0000 1.9
+++ Layout.java 28 May 2004 17:16:43 -0000 1.10
@@ -38,11 +38,17 @@
public static final int LINE_SEP_LEN = LINE_SEP.length();
final static Logger logger = Logger.getLogger(Layout.class);
-
+
+
public CharArrayWriter charArrayWriter = new CharArrayWriter(1024);
+
+ String header;
+ String footer;
+
+
/**
- Implement this method to create your own layout format.
- */
+ * Implement this method to create your own layout format.
+ * */
public String format(LoggingEvent event) {
charArrayWriter.reset();
try {
@@ -65,19 +71,20 @@
}
/**
- Returns the header for the layout format. The base class returns
- <code>null</code>. */
+ * Returns the header for the layout format. There is no default header.
+ * */
public String getHeader() {
- return null;
+ return header;
}
/**
- Returns the footer for the layout format. The base class returns
- <code>null</code>. */
+ * Returns the footer for the layout format. There is no default footer.
+ */
public String getFooter() {
- return null;
+ return footer;
}
+
/**
If the layout handles the throwable object contained within
{@link LoggingEvent}, then the layout should return
@@ -90,4 +97,26 @@
@since 0.8.4 */
public abstract boolean ignoresThrowable();
+
+ /**
+ * Set the footer. Note that some layout have their own footers and may choose
+ * to ignote the footer set here.
+ *
+ * @param footer the footer
+ * @since 1.3
+ */
+ public void setFooter(String footer) {
+ this.footer = footer;
+ }
+
+ /**
+ * Set the header. Note that some layout have their own headers and may choose
+ * to ignote the header set here.
+ *
+ * @param header the header
+ * @since 1.3
+ */
+ public void setHeader(String header) {
+ this.header = header;
+ }
}
1.42 +5 -26 logging-log4j/src/java/org/apache/log4j/FileAppender.java
Index: FileAppender.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/FileAppender.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- FileAppender.java 27 Feb 2004 16:47:28 -0000 1.41
+++ FileAppender.java 28 May 2004 17:16:43 -0000 1.42
@@ -162,18 +162,12 @@
}
/**
- Closes the previously opened file.
+ * Closes the previously opened file.
+ *
+ * @deprecated Use the super class' {@link #closeWriter} method instead.
*/
protected void closeFile() {
- if (this.qw != null) {
- try {
- this.qw.close();
- } catch (java.io.IOException e) {
- // Exceptionally, it does not make sense to delegate to an
- // ErrorHandler. Since a closed appender is basically dead.
- LogLog.error("Could not close " + qw, e);
- }
- }
+ closeWriter();
}
/**
@@ -257,7 +251,7 @@
setImmediateFlush(false);
}
- reset();
+ closeWriter();
Writer fw = createWriter(new FileOutputStream(filename, append));
@@ -281,20 +275,5 @@
*/
protected void setQWForFiles(Writer writer) {
this.qw = new QuietWriter(writer, errorHandler);
- }
-
- /**
- Close any previously opened file and call the parent's
- <code>reset</code>. */
- protected void reset() {
- closeFile();
-
- // The following line is commented out. It causes problems with the setFile
- // method taking 4 params which calls the reset method. If there is a
- // problem with the createWrite call then the fileName never gets set properly.
-
- // this.fileName = null;
-
- super.reset();
}
}
1.20 +2 -1 logging-log4j/src/java/org/apache/log4j/RollingFileAppender.java
Index: RollingFileAppender.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/RollingFileAppender.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- RollingFileAppender.java 27 Feb 2004 16:47:28 -0000 1.19
+++ RollingFileAppender.java 28 May 2004 17:16:43 -0000 1.20
@@ -140,7 +140,8 @@
// Rename fileName to fileName.1
target = new File(fileName + "." + 1);
- this.closeFile(); // keep windows happy.
+ // Gracefully close the old the log file.
+ this.closeWriter();
file = new File(fileName);
LogLog.debug("Renaming file " + file + " to " + target);
---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org