carnold     2005/05/07 09:56:41

  Modified:    src/java/org/apache/log4j ConsoleAppender.java
  Log:
  Bug 31056: Console appender doesn't notices changes to System.out
  
  Revision  Changes    Path
  1.24      +138 -72   
logging-log4j/src/java/org/apache/log4j/ConsoleAppender.java
  
  Index: ConsoleAppender.java
  ===================================================================
  RCS file: 
/home/cvs/logging-log4j/src/java/org/apache/log4j/ConsoleAppender.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- ConsoleAppender.java      8 Mar 2005 22:32:56 -0000       1.23
  +++ ConsoleAppender.java      7 May 2005 16:56:41 -0000       1.24
  @@ -1,21 +1,23 @@
   /*
    * Copyright 1999,2005 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.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
  -
   package org.apache.log4j;
   
  +import java.io.IOException;
  +import java.io.OutputStream;
  +
   
   /**
     * ConsoleAppender appends log events to <code>System.out</code> or
  @@ -23,74 +25,138 @@
     * default target is <code>System.out</code>.
     *
     * @author <a href="http://www.qos.ch/log4j/";>Ceki G&uuml;lc&uuml;</a>
  +  * @author Curt Arnold
     * @since 1.1 */
   public class ConsoleAppender extends WriterAppender {
  -  public static final String SYSTEM_OUT = "System.out";
  -  public static final String SYSTEM_ERR = "System.err";
  -  protected String target = SYSTEM_OUT;
  -
  -  /**
  -   * As in most cases, the default constructor does nothing.
  -   */
  -  public ConsoleAppender() {
  -  }
  -
  -  public ConsoleAppender(Layout layout) {
  -    this(layout, SYSTEM_OUT);
  -  }
  -
  -  public ConsoleAppender(Layout layout, String targetStr) {
  -    this.layout = layout;
  -    setTarget(targetStr);
  -    activateOptions();
  -  }
  -
  -  /**
  -   *  Sets the value of the <b>Target</b> option. Recognized values
  -   *  are "System.out" and "System.err". Any other value will be
  -   *  ignored.
  -   * */
  -  public void setTarget(String value) {
  -    String v = value.trim();
  -
  -    if (SYSTEM_OUT.equalsIgnoreCase(v)) {
  -      target = SYSTEM_OUT;
  -    } else if (SYSTEM_ERR.equalsIgnoreCase(v)) {
  -      target = SYSTEM_ERR;
  -    } else {
  -      targetWarn(value);
  -    }
  -  }
  -
  -  /**
  -   * Returns the current value of the <b>Target</b> property. The
  -   * default value of the option is "System.out".
  -   *
  -   * See also [EMAIL PROTECTED] #setTarget}.
  -   * */
  -  public String getTarget() {
  -    return target;
  -  }
  -
  -  void targetWarn(String val) {
  -    getLogger().warn("[{}] should be System.out or System.err.", val);
  -    getLogger().warn("Using previously set target, System.out by default.");
  -  }
  -
  -  public void activateOptions() {
  -    if (target.equals(SYSTEM_OUT)) {
  -      setWriter(createWriter(System.out));
  -    } else {
  -      setWriter(createWriter(System.err));
  -    }
  -    super.activateOptions();
  -  }
  -
  -  /**
  -   *  This method overrides the parent [EMAIL PROTECTED]
  -   *  WriterAppender#closeWriter} implementation to do nothing because
  -   *  the console stream is not ours to close.
  -   * */
  -  protected final void closeWriter() {
  -  }
  +    public static final String SYSTEM_OUT = "System.out";
  +    public static final String SYSTEM_ERR = "System.err";
  +    protected String target = SYSTEM_OUT;
  +
  +    /**
  +     * Constructs an unconfigured appender.
  +     */
  +    public ConsoleAppender() {
  +    }
  +
  +    /**
  +     * Creates a configured appender.
  +     *
  +     * @param layout layout, may not be null.
  +     */
  +    public ConsoleAppender(final Layout layout) {
  +        setLayout(layout);
  +        activateOptions();
  +    }
  +
  +    /**
  +     *   Creates a configured appender.
  +     * @param layout layout, may not be null.
  +     * @param targetStr target, either "System.err" or "System.out".
  +     */
  +    public ConsoleAppender(final Layout layout, final String targetStr) {
  +        setLayout(layout);
  +        setTarget(targetStr);
  +        activateOptions();
  +    }
  +
  +    /**
  +     *  Sets the value of the <b>Target</b> option. Recognized values
  +     *  are "System.out" and "System.err". Any other value will be
  +     *  ignored.
  +     * */
  +    public void setTarget(final String value) {
  +        String v = value.trim();
  +
  +        if (SYSTEM_OUT.equalsIgnoreCase(v)) {
  +            target = SYSTEM_OUT;
  +        } else if (SYSTEM_ERR.equalsIgnoreCase(v)) {
  +            target = SYSTEM_ERR;
  +        } else {
  +            getLogger().warn("[{}] should be System.out or System.err.", 
value);
  +            getLogger().warn("Using previously set target, System.out by 
default.");
  +        }
  +    }
  +
  +    /**
  +     * Returns the current value of the <b>Target</b> property. The
  +     * default value of the option is "System.out".
  +     *
  +     * See also [EMAIL PROTECTED] #setTarget}.
  +     * */
  +    public String getTarget() {
  +        return target;
  +    }
  +
  +    /**
  +     *   Prepares the appender for use.
  +     */
  +    public void activateOptions() {
  +        if (target.equals(SYSTEM_ERR)) {
  +            setWriter(createWriter(new SystemErrStream()));
  +        } else {
  +            setWriter(createWriter(new SystemOutStream()));
  +        }
  +
  +        super.activateOptions();
  +    }
  +
  +    /**
  +     * An implementation of OutputStream that redirects to the
  +     * current System.err.
  +     *
  +     */
  +    private static class SystemErrStream extends OutputStream {
  +        public SystemErrStream() {
  +        }
  +
  +        public void close() {
  +        }
  +
  +        public void flush() {
  +            System.err.flush();
  +        }
  +
  +        public void write(final byte[] b) throws IOException {
  +            System.err.write(b);
  +        }
  +
  +        public void write(final byte[] b, final int off, final int len)
  +            throws IOException {
  +            System.err.write(b, off, len);
  +        }
  +
  +        public void write(final int b) throws IOException {
  +            System.err.write(b);
  +        }
  +    }
  +
  +    /**
  +     * An implementation of OutputStream that redirects to the
  +     * current System.out.
  +     *
  +     */
  +    private static class SystemOutStream extends OutputStream {
  +        public SystemOutStream() {
  +        }
  +
  +        public void close() {
  +        }
  +
  +        public void flush() {
  +            System.out.flush();
  +        }
  +
  +        public void write(final byte[] b) throws IOException {
  +            System.out.write(b);
  +        }
  +
  +        public void write(final byte[] b, final int off, final int len)
  +            throws IOException {
  +            System.out.write(b, off, len);
  +        }
  +
  +        public void write(final int b) throws IOException {
  +            System.out.write(b);
  +        }
  +    }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to