ceki        2003/03/19 11:54:46

  Added:       src/java/org/apache/log4j/rolling RollingFileAppender.java
  Log:
  Starting point for improved RollingFileAppender.java
  
  Revision  Changes    Path
  1.1                  
jakarta-log4j/src/java/org/apache/log4j/rolling/RollingFileAppender.java
  
  Index: RollingFileAppender.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software
   * License version 1.1, a copy of which has been included with this
   * distribution in the LICENSE.txt file.  */
  
  
  
  package org.apache.log4j.rolling;
  
  import java.io.IOException;
  import java.io.Writer;
  import java.io.File;
  
  import org.apache.log4j.FileAppender;
  import org.apache.log4j.helpers.OptionConverter;
  import org.apache.log4j.helpers.LogLog;
  import org.apache.log4j.helpers.CountingQuietWriter;
  import org.apache.log4j.spi.LoggingEvent;
  
  /**
   * RollingFileAppender extends FileAppender to backup the log files
   * depending on rotation policy.
   *
   * @author Heinz Richter
   * @author Ceki Gülcü 
   * */
  public class RollingFileAppender extends FileAppender {
  
  
    File file;
  
    TriggeringPolicy triggeringPolicy;
    CopyingPolicy copyingPolicy;
  
    int maxBackupIndex;
    /**
     * The default constructor simply calls its [EMAIL PROTECTED]
     * FileAppender#FileAppender parents constructor}.
     * */
    public RollingFileAppender() {
      super();
    }
  
    /**
       Implements the usual roll over behaviour.
  
       <p>If <code>MaxBackupIndex</code> is positive, then files
       {<code>File.1</code>, ..., <code>File.MaxBackupIndex -1</code>}
       are renamed to {<code>File.2</code>, ...,
       <code>File.MaxBackupIndex</code>}. Moreover, <code>File</code> is
       renamed <code>File.1</code> and closed. A new <code>File</code> is
       created to receive further log output.
  
       <p>If <code>MaxBackupIndex</code> is equal to zero, then the
       <code>File</code> is truncated with no backup files created.
  
     */
    public // synchronization not necessary since doAppend is already synched
    void rollOver() {
      File target;
      File file;
  
      // If maxBackups <= 0, then there is no file renaming to be done.
      if(maxBackupIndex > 0) {
        // Delete the oldest file, to keep Windows happy.
        file = new File(fileName + '.' + maxBackupIndex);
        if (file.exists())
         file.delete();
  
        // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
        for (int i = maxBackupIndex - 1; i >= 1; i--) {
        file = new File(fileName + "." + i);
        if (file.exists()) {
          target = new File(fileName + '.' + (i + 1));
          LogLog.debug("Renaming file " + file + " to " + target);
          file.renameTo(target);
        }
        }
  
        // Rename fileName to fileName.1
        target = new File(fileName + "." + 1);
  
        this.closeFile(); // keep windows happy.
  
        file = new File(fileName);
        LogLog.debug("Renaming file " + file + " to " + target);
        file.renameTo(target);
      }
  
      try {
        // This will also close the file. This is OK since multiple
        // close operations are safe.
        this.setFile(fileName, false, bufferedIO, bufferSize);
      }
      catch(IOException e) {
        LogLog.error("setFile("+fileName+", false) call failed.", e);
      }
    }
  
    public synchronized void setFile(String fileName, boolean append, 
                                   boolean bufferedIO, int bufferSize) 
                                                              throws IOException {
      super.setFile(fileName, append, this.bufferedIO, this.bufferSize);
      file = new File(fileName);
    }
  
  
    /**
       This method differentiates RollingFileAppender from its super
       class.
  
       @since 0.9.0
    */
    protected
    void subAppend(LoggingEvent event) {
      super.subAppend(event);
      
      boolean trigger;
      if(triggeringPolicy.isSizeSensitive()) {
        trigger = triggeringPolicy.isTriggeringEvent(file.length());
      } else {
        trigger = triggeringPolicy.isTriggeringEvent();
      }
  
      if(trigger) {
        closeFile();
        copyingPolicy.copy(file);
        file = new File(fileName);
      }
    }
  }
  
  
  

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

Reply via email to