ceki 01/08/14 14:00:34 Modified: src/java/org/apache/log4j AsyncAppender.java DailyRollingFileAppender.java FileAppender.java Makefile RollingFileAppender.java src/java/org/apache/log4j/helpers PatternParser.java src/java/org/apache/log4j/spi LoggingEvent.java src/java/org/apache/log4j/test confParsing Removed: src/java/org/apache/log4j CompositeRollingAppender.java Log: Added MDC support in AsyncAppender. Added bufferedIO support in FileAppender and subclasses. Removed CompositeRollingAppender because I do not understand and hence cannot maintain it. Revision Changes Path 1.23 +3 -0 jakarta-log4j/src/java/org/apache/log4j/AsyncAppender.java Index: AsyncAppender.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/AsyncAppender.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- AsyncAppender.java 2001/07/26 11:16:48 1.22 +++ AsyncAppender.java 2001/08/14 21:00:34 1.23 @@ -108,6 +108,9 @@ // LoggingEvent fields were not set at event creation time. event.getNDC(); event.getThreadName(); + // Get a copy of this thread's MDC. + + event.getMDCCopy(); if(locationInfo) { event.getLocationInformation(); } 1.17 +1 -1 jakarta-log4j/src/java/org/apache/log4j/DailyRollingFileAppender.java Index: DailyRollingFileAppender.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/DailyRollingFileAppender.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- DailyRollingFileAppender.java 2001/07/26 11:16:48 1.16 +++ DailyRollingFileAppender.java 2001/08/14 21:00:34 1.17 @@ -300,7 +300,7 @@ try { // This will also close the file. This is OK since multiple // close operations are safe. - this.setFile(fileName, false); + this.setFile(fileName, false, this.bufferedIO, this.bufferSize); } catch(IOException e) { errorHandler.error("setFile("+fileName+", false) call failed."); 1.28 +73 -89 jakarta-log4j/src/java/org/apache/log4j/FileAppender.java Index: FileAppender.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/FileAppender.java,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- FileAppender.java 2001/08/13 15:12:10 1.27 +++ FileAppender.java 2001/08/14 21:00:34 1.28 @@ -27,10 +27,9 @@ /** FileAppender appends log events to a file. - <b>Support for java.io.Writer and console appending has been - deprecated and will be removed in the near future.</b> You are - strongly encouraged to use the replacement solutions: {@link - WriterAppender} and {@link ConsoleAppender}. + <p>Support for <code>java.io.Writer</code> and console appending + has been deprecated and then removed. See the replacement + solutions: {@link WriterAppender} and {@link ConsoleAppender}. @author Ceki Gülcü */ @@ -51,16 +50,13 @@ protected String fileName = null; /** - Is the QuietWriter ours or was it created and passed by the user? - - @deprecated FileAppender will not support streams passed by the - user in the future. */ - protected boolean qwIsOurs = false; - - /** Do we do bufferedIO? */ protected boolean bufferedIO = false; + /** + How big should the IO buffer be? Default is 8K. */ + protected int bufferSize = 8*1024; + /** The default constructor does not do anything. @@ -69,37 +65,25 @@ FileAppender() { } - /** - Instantiate a FileAppender and set the output destination to a - new {@link OutputStreamWriter} initialized with <code>os</code> - as its {@link OutputStream}. - - @deprecated <b>The functionality of this constructor form has - been replaced by the {@link WriterAppender}. This constructor - will be removed in the <em>near</em> term.</b> + Instantiate a <code>FileAppender</code> and open the file + designated by <code>filename</code>. The opened filename will + become the output destination for this appender. - */ - public - FileAppender(Layout layout, OutputStream os) { - super(layout, os); - } - - /** - Instantiate a FileAppender and set the output destination to - <code>writer</code>. - - <p>The <code>writer</code> must have been opened by the user. + <p>If the <code>append</code> parameter is true, the file will be + appended to. Otherwise, the file designated by + <code>filename</code> will be truncated before being opened. - @deprecated <b>The functionality of constructor form has been - replaced by the {@link WriterAppender}. This constructor will be - removed in the <em>near</em> term.</b> + <p>If the <code>bufferedIO</code> parameter is <code>true</code>, + then buffered IO will be used to write to the output file. + */ public - FileAppender(Layout layout, Writer writer) { - super(layout, writer); - } - + FileAppender(Layout layout, String filename, boolean append, boolean bufferedIO, + int bufferSize) throws IOException { + this.layout = layout; + this.setFile(filename, append, bufferedIO, bufferSize); + } /** Instantiate a FileAppender and open the file designated by @@ -111,10 +95,9 @@ <code>filename</code> will be truncated before being opened. */ public - FileAppender(Layout layout, String filename, boolean append) - throws IOException { + FileAppender(Layout layout, String filename, boolean append) throws IOException { this.layout = layout; - this.setFile(filename, append); + this.setFile(filename, append, false, bufferSize); } /** @@ -130,32 +113,18 @@ /** The <b>File</b> property takes a string value which should be the - name of the file to append to. Special values "System.out" or - "System.err" are interpreted as the standard out and standard - error streams. - - <p><font color="#DD0044"><b>Note that the "System.out" or "System.err" - options are deprecated. Please use {@link ConsoleAppender} - instead.</b></font> - - <p>If the option is set to "System.out" or "System.err" the - output will go to the corresponding stream. Otherwise, if the - option is set to the name of a file, then the file will be opened - and output will go there. - + name of the file to append to. + + <p><font color="#DD0044"><b>Note that the special values + "System.out" or "System.err" are no longer honored.</b></font> + <p>Note: Actual opening of the file is made when {@link #activateOptions} is called, not when the options are set. */ public void setFile(String file) { // Trim spaces from both ends. The users probably does not want // trailing spaces in file names. String val = file.trim(); - if(val.equalsIgnoreCase("System.out")) { - setWriter(new OutputStreamWriter(System.out)); - } else if(val.equalsIgnoreCase("System.err")) { - setWriter(new OutputStreamWriter(System.err)); - } else { - fileName = val; - } + fileName = val; } /** @@ -172,23 +141,7 @@ String getFile() { return fileName; } - - /** - The <b>Append</b> option takes a boolean value. It is set to - <code>true</code> by default. If true, then <code>File</code> - will be opened in append mode by {@link #setFile setFile} (see - above). Otherwise, {@link #setFile setFile} will open - <code>File</code> in truncate mode. - <p>Note: Actual opening of the file is made when {@link - #activateOptions} is called, not when the options are set. - */ - public - void setAppend(boolean flag) { - fileAppend = flag; - } - - /** If the value of <b>File</b> is not <code>null</code>, then {@link #setFile} is called with the values of <b>File</b> and @@ -196,10 +149,10 @@ @since 0.8.1 */ public - void activateOptions() { + void activateOptions() { if(fileName != null) { try { - setFile(fileName, fileAppend); + setFile(fileName, fileAppend, bufferedIO, bufferSize); } catch(java.io.IOException e) { errorHandler.error("setFile("+fileName+","+fileAppend+") call failed.", @@ -217,8 +170,7 @@ */ protected void closeFile() { - // FIXME (remove qwIsOurs) - if(this.qw != null && this.qwIsOurs) { + if(this.qw != null) { try { this.qw.close(); } @@ -231,6 +183,38 @@ } /** + The <b>Append</b> option takes a boolean value. It is set to + <code>true</code> by default. If true, then <code>File</code> + will be opened in append mode by {@link #setFile setFile} (see + above). Otherwise, {@link #setFile setFile} will open + <code>File</code> in truncate mode. + + <p>Note: Actual opening of the file is made when {@link + #activateOptions} is called, not when the options are set. + */ + public + void setAppend(boolean flag) { + fileAppend = flag; + } + + /** + The <b>BufferedIO</b> option takes a boolean value. It is set to + <code>false</code> by default. If true, then <code>File</code> + will be opened and the resulting {@link java.io.Writer} wrapped + around a {@link BufferedWriter}. + + BufferedIO will significatnly increase performance on heavily + loaded systems. + + */ + public + void setBufferedIO(boolean bufferedIO) { + this.bufferedIO = bufferedIO; + } + + + + /** <p>Sets and <i>opens</i> the file where the log output will go. The specified file must be writable. @@ -242,9 +226,14 @@ truncate fileName. */ public synchronized - void setFile(String fileName, boolean append) + void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize) throws IOException { LogLog.debug("setFile called: "+fileName+", "+append); + + // It does not make sense to have immediate flush and bufferedIO. + if(bufferedIO) { + setImmediateFlush(false); + } reset(); Writer fw = new FileWriter(fileName, append); @@ -252,10 +241,10 @@ fw = new BufferedWriter(fw); } this.setQWForFiles(fw); - //this.tp = new TracerPrintWriter(qw); this.fileName = fileName; this.fileAppend = append; - this.qwIsOurs = true; + this.bufferedIO = bufferedIO; + this.bufferSize = bufferSize; writeHeader(); LogLog.debug("setFile ended"); } @@ -279,12 +268,7 @@ void reset() { closeFile(); this.fileName = null; - if(qwIsOurs) { - super.reset(); - } else { - this.qw = null; - //this.tp = null; - } + super.reset(); } } 1.14 +1 -1 jakarta-log4j/src/java/org/apache/log4j/Makefile Index: Makefile =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/Makefile,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- Makefile 2001/08/06 16:38:14 1.13 +++ Makefile 2001/08/14 21:00:34 1.14 @@ -3,7 +3,6 @@ DEPTH :=../../../../.. JSOURCES:=HTMLLayout.java\ DailyRollingFileAppender.java\ - CompositeRollingAppender.java\ RollingFileAppender.java\ PropertyConfigurator.java\ PatternLayout.java\ @@ -25,6 +24,7 @@ WriterAppender.java\ ConsoleAppender.java\ MDC.java\ + ifdef $(ISJDK1) JSOURCES:=$(JSOURCES) RollingFileAppenderBeanInfo.java 1.15 +4 -3 jakarta-log4j/src/java/org/apache/log4j/RollingFileAppender.java Index: RollingFileAppender.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/RollingFileAppender.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- RollingFileAppender.java 2001/07/20 16:57:15 1.14 +++ RollingFileAppender.java 2001/08/14 21:00:34 1.15 @@ -147,7 +147,7 @@ try { // This will also close the file. This is OK since multiple // close operations are safe. - this.setFile(fileName, false); + this.setFile(fileName, false, bufferedIO, bufferSize); } catch(IOException e) { LogLog.error("setFile("+fileName+", false) call failed.", e); @@ -156,8 +156,9 @@ public synchronized - void setFile(String fileName, boolean append) throws IOException { - super.setFile(fileName, append); + void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize) + throws IOException { + super.setFile(fileName, append, this.bufferedIO, this.bufferSize); if(append) { File f = new File(fileName); ((CountingQuietWriter) qw).setCount(f.length()); 1.13 +1 -2 jakarta-log4j/src/java/org/apache/log4j/helpers/PatternParser.java Index: PatternParser.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/helpers/PatternParser.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- PatternParser.java 2001/08/06 19:29:19 1.12 +++ PatternParser.java 2001/08/14 21:00:34 1.13 @@ -12,7 +12,6 @@ import org.apache.log4j.helpers.AbsoluteTimeDateFormat; import org.apache.log4j.Layout; import org.apache.log4j.NDC; -import org.apache.log4j.MDC; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.LocationInfo; import org.apache.log4j.or.ObjectRenderer; @@ -456,7 +455,7 @@ public String convert(LoggingEvent event) { - Object val = MDC.get(key); + Object val = event.getMDC(key); if(val == null) { return null; } else { 1.18 +11 -20 jakarta-log4j/src/java/org/apache/log4j/spi/LoggingEvent.java Index: LoggingEvent.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/spi/LoggingEvent.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- LoggingEvent.java 2001/08/13 10:22:10 1.17 +++ LoggingEvent.java 2001/08/14 21:00:34 1.18 @@ -176,6 +176,13 @@ return ndc; } + + /** + Retrung the the context corresponding to the <code>key</code> + parameter. If there is a local MDC copy (probably from a remote + machine, the search try it first, if that fails then search this + thread's <code>MDC</code>. + */ public Object getMDC(String key) { Object r; @@ -189,32 +196,16 @@ return MDC.get(key); } - protected + /** + Obtain a copy of this thread's MDC prior to serialization or + asynchronous logging. */ + public void getMDCCopy() { if(mdcLookupRequired) { ndcLookupRequired = false; mdcCopy = MDC.getContext(); } } - - - - // if(mdcLookupRequired) { - // mdcLookupRequired = false; - // mdc = MDC.getContext(); - // if(mdc != null) - // return mdc.get(key); - // } - // - // - // Object r = mdc.get(key); - // if(r == null) { - // return MDC.get(key); - // } else { - // return r; - // } - //} - public String getRenderedMessage() { 1.8 +1 -2 jakarta-log4j/src/java/org/apache/log4j/test/confParsing Index: confParsing =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/test/confParsing,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- confParsing 2001/04/17 22:32:38 1.7 +++ confParsing 2001/08/14 21:00:34 1.8 @@ -182,9 +182,8 @@ D_FLAG="" echo "log4j.rootCategory= DEBUG , testAppender" > $LCF lecho "log4j.debug=false" - lecho "log4j.appender.testAppender=org.apache.log4j.FileAppender" + lecho "log4j.appender.testAppender=org.apache.log4j.ConsoleAppender" # Note the spaces - lecho "log4j.appender.testAppender.File=System.out " lecho "log4j.appender.testAppender.layout=org.apache.log4j.PatternLayout " lecho "log4j.appender.testAppender.layout.ConversionPattern=[%t] %p - %m%n" echo -n " ConfigurationParsing test $TEST - " --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]