https://issues.apache.org/bugzilla/show_bug.cgi?id=45934

--- Comment #2 from Jesus Alejandre <[email protected]> ---
Comment on attachment 22667
  --> https://issues.apache.org/bugzilla/attachment.cgi?id=22667
Patch to FileAppender.java that produces implementation of proposed feature.

>Index: src/main/java/org/apache/log4j/FileAppender.java
>===================================================================
>--- src/main/java/org/apache/log4j/FileAppender.java   (revision 701074)
>+++ src/main/java/org/apache/log4j/FileAppender.java   (working copy)
>@@ -17,14 +17,21 @@
> 
> package org.apache.log4j;
> 
>-import java.io.*;
>+import java.io.BufferedWriter;
>+import java.io.File;
>+import java.io.FileNotFoundException;
>+import java.io.FileOutputStream;
>+import java.io.IOException;
>+import java.io.InterruptedIOException;
>+import java.io.Writer;
> 
>-import org.apache.log4j.spi.ErrorCode;
>-import org.apache.log4j.helpers.QuietWriter;
> import org.apache.log4j.helpers.LogLog;
>+import org.apache.log4j.helpers.QuietWriter;
>+import org.apache.log4j.spi.ErrorCode;
> 
> // Contibutors: Jens Uwe Pipka <[email protected]>
> //              Ben Sandee
>+//              Martin Burger <[email protected]>
> 
> /**
>  *  FileAppender appends log events to a file.
>@@ -60,6 +67,11 @@
>    */
>   protected int bufferSize = 8*1024;
> 
>+  /**
>+   * Do we use shutdown hook to flush buffer automatically? 
>+   */
>+  protected boolean useShutdownHook = false;
>+
> 
>   /**
>      The default constructor does not do anything.
>@@ -85,7 +97,7 @@
>   FileAppender(Layout layout, String filename, boolean append, boolean 
> bufferedIO,
>              int bufferSize) throws IOException {
>     this.layout = layout;
>-    this.setFile(filename, append, bufferedIO, bufferSize);
>+    this.setFile(filename, append, bufferedIO, bufferSize, useShutdownHook);
>   }
> 
>   /**
>@@ -101,7 +113,7 @@
>   FileAppender(Layout layout, String filename, boolean append)
>                                                              throws 
> IOException {
>     this.layout = layout;
>-    this.setFile(filename, append, false, bufferSize);
>+    this.setFile(filename, append, false, bufferSize, useShutdownHook);
>   }
> 
>   /**
>@@ -156,7 +168,7 @@
>   void activateOptions() {
>     if(fileName != null) {
>       try {
>-      setFile(fileName, fileAppend, bufferedIO, bufferSize);
>+      setFile(fileName, fileAppend, bufferedIO, bufferSize, useShutdownHook);
>       }
>       catch(java.io.IOException e) {
>       errorHandler.error("setFile("+fileName+","+fileAppend+") call failed.",
>@@ -167,6 +179,10 @@
>       LogLog.warn("File option not set for appender ["+name+"].");
>       LogLog.warn("Are you using FileAppender instead of ConsoleAppender?");
>     }
>+
>+    if (this.bufferedIO && this.useShutdownHook) {
>+      Runtime.getRuntime().addShutdownHook(new 
>FileAppenderShutdownHook(this));
>+    }
>   }
> 
>  /**
>@@ -176,6 +192,9 @@
>   void closeFile() {
>     if(this.qw != null) {
>       try {
>+    if (this.bufferedIO && this.useShutdownHook) {
>+      this.qw.flush();
>+    }
>       this.qw.close();
>       }
>       catch(java.io.IOException e) {
>@@ -210,6 +229,15 @@
>     return this.bufferSize;
>   }
> 
>+  /**
>+  Get the value of the <b>ShutdownHook</b> option.
>+
>+  */
>+  public
>+  boolean getShutdownHook() {
>+   return this.useShutdownHook;
>+  }
>+
> 
> 
>   /**
>@@ -255,6 +283,43 @@
>   }
> 
>   /**
>+  The <b>ShutdownHook</b> option takes a boolean value. It is set to
>+  <code>false</code> by default. If <code>true</code> and 
><code>BufferedIO</code>
>+  is set to <code>true</code> as well, a virtual-machine shutdown hook will
>+  be registered that flushes and closes the underling stream.
>+  
>+  <p>Use this option to avoid lost log messages.</p>
>+
>+  @see WriterAppender#setImmediateFlush(boolean)
>+  */
>+  public
>+  void setShutdownHook(boolean shutdownHook) {
>+   this.useShutdownHook = shutdownHook;
>+  }
>+
>+
>+  /**
>+  <p>Sets and <i>opens</i> the file where the log output will
>+  go. The specified file must be writable.
>+
>+  <p>If there was already an opened file, then the previous file
>+  is closed first.
>+
>+  <p><b>Do not use this method directly. To configure a FileAppender
>+  or one of its subclasses, set its properties one by one and then
>+  call activateOptions.</b>
>+
>+  @param fileName The path to the log file.
>+  @param append   If true will append to fileName. Otherwise will
>+      truncate fileName.  */
>+  public
>+  synchronized
>+  void setFile(String fileName, boolean append, boolean bufferedIO, int 
>bufferSize)
>+                                                          throws IOException {
>+    this.setFile(fileName, append, bufferedIO, bufferSize, useShutdownHook);
>+  }
>+  
>+  /**
>     <p>Sets and <i>opens</i> the file where the log output will
>     go. The specified file must be writable.
> 
>@@ -270,7 +335,7 @@
>         truncate fileName.  */
>   public
>   synchronized
>-  void setFile(String fileName, boolean append, boolean bufferedIO, int 
>bufferSize)
>+  void setFile(String fileName, boolean append, boolean bufferedIO, int 
>bufferSize, boolean shutdownHook)
>                                                             throws 
> IOException {
>     LogLog.debug("setFile called: "+fileName+", "+append);
> 
>@@ -313,6 +378,7 @@
>     this.fileAppend = append;
>     this.bufferedIO = bufferedIO;
>     this.bufferSize = bufferSize;
>+    this.useShutdownHook = shutdownHook;
>     writeHeader();
>     LogLog.debug("setFile ended");
>   }
>@@ -338,5 +404,20 @@
>     this.fileName = null;
>     super.reset();
>   }
>+
>+
>+  private static class FileAppenderShutdownHook extends Thread {
>+
>+      private final FileAppender appender;
>+
>+      public FileAppenderShutdownHook(FileAppender appender) {
>+          this.appender = appender;
>+      }
>+
>+      public void run() {
>+          this.appender.close();
>+      }
>+  }
>+
> }
> 
>

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to