2012-08-24 42 views
3

我正在使用Log4j作爲日誌框架在我正在開發的項目中。我有以下情況:Log4j被配置爲將日誌寫入日誌文件。在某些時候,這個日誌文件被複制到另一個目的地並被刪除。日誌記錄框架繼續工作,但日誌不會寫入日誌文件,因爲它被刪除。有什麼辦法可以告訴Log4j重新創建文件並不斷將日誌寫入日誌文件。Log4j FileAppender重新創建刪除的文件

最好的問候, 拉希德

+0

的[Log4j的不會重新上刪除文件]可能的複製(https://stackoverflow.com/questions/9937796/log4j-does-not-recreate-files-on-deletion) – Lambart

回答

1

我學習的log4j的來源和發現的log4j不能創建新的日誌文件,它只是打印錯誤消息System.err的當日誌文件被刪除

/** 
    This method determines if there is a sense in attempting to append. 

    <p>It checks whether there is a set output target and also if 
    there is a set layout. If these checks fail, then the boolean 
    value <code>false</code> is returned. */ 

    protected boolean checkEntryConditions() { 
    if(this.closed) { 
     LogLog.warn("Not allowed to write to a closed appender."); 
     return false; 
    } 

    if(this.qw == null) { 
     errorHandler.error("No output stream or file set for the appender named ["+ 
      name+"]."); 
     return false; 
    } 

    if(this.layout == null) { 
     errorHandler.error("No layout set for the appender named ["+ name+"]."); 
     return false; 
    } 
    return true; 
    } 

我想有兩個解決方法

  1. 創建另一個cron的線程來監視日誌文件getLog或的getInstance(單)
  2. 加判斷,檢查日誌文件不存在,如果沒有則初始化log4j的
+0

感謝您提供此代碼snipet。您提出的第一個解決方法並不夠簡單。我想我會嘗試實施您建議的第二種解決方法。您提到的方法getLog和getInstance,它們位於哪個類中? –

1

確保你可以在你的log4j文件

log4j.appender.rollingFile.File=D:/myapp/mylog.log 

聲明此行如果你已經宣佈它,您日誌文件可以刪除或替換,只要你喜歡。然後重新運行程序,並在此路徑中創建新的日誌文件。

+0

感謝您的建議,但它不適合我。我不想重新啓動應用程序。 –

+0

您不需要重新啓動。您可以配置RollingFileAppender以創建新的日誌文件。這意味着log4j會在它們「滿」時重命名並移動它們,然後它會創建一個新的日誌文件。 –

+0

我不明白這將如何爲我工作。正如你所說,當現有文件已滿時,將創建新文件。在我的情況下,我需要在刪除現有文件時創建新文件。 –

1

嘗試這個類

package wodong.test; 
import java.io.File; 
import java.io.IOException; 

import org.apache.log4j.FileAppender; 
import org.apache.log4j.spi.LoggingEvent; 

public class LastFileAppender extends FileAppender { 
    @Override 
    public void append(LoggingEvent event) { 
     checkLogFileExist(); 
     super.append(event); 
    } 
    private void checkLogFileExist(){ 
     File logFile = new File(super.fileName); 
     if (!logFile.exists()) { 
      try { 
       logFile.createNewFile(); 
      } catch (IOException e) { 
       System.out.println("Error while create new log file."); 
      } 
     } 
    } 
} 

還需要編輯log4j的配置文件

log4j.appender.R=wodong.test.LastFileAppender 
+1

我已經試過了。它可以工作,但是會有明顯的性能下降。用這樣的appender記錄大概慢10倍。 –

0

試試這個。我現在沒有Linux機器,所以我不確定它是否能解決性能問題。

package wodong.test; 
import java.io.File; 
import java.io.IOException; 

import org.apache.log4j.FileAppender; 
import org.apache.log4j.spi.LoggingEvent; 

public class LastFileAppender extends FileAppender { 
    @Override 
    public void append(LoggingEvent event) { 

     checkLogFileExist(); 
     super.append(event); 
    } 

    private void checkLogFileExist() { 
     if (qw == null) { 
      File logFile = new File(super.fileName); 
      if (!logFile.exists()) { 
       try { 
        logFile.createNewFile(); 
       } catch (IOException e) { 
        System.out.println("Error while create new log file."); 
       } 
      } 
     } 
    } 
} 
+0

你好。謝謝。實際上,性能下降並不那麼顯着。我檢查了Apache Tomcat。在那裏的訪問日誌實現中使用類似的代碼。 –