我正在使用Log4j作爲日誌框架在我正在開發的項目中。我有以下情況:Log4j被配置爲將日誌寫入日誌文件。在某些時候,這個日誌文件被複制到另一個目的地並被刪除。日誌記錄框架繼續工作,但日誌不會寫入日誌文件,因爲它被刪除。有什麼辦法可以告訴Log4j重新創建文件並不斷將日誌寫入日誌文件。Log4j FileAppender重新創建刪除的文件
最好的問候, 拉希德
我正在使用Log4j作爲日誌框架在我正在開發的項目中。我有以下情況:Log4j被配置爲將日誌寫入日誌文件。在某些時候,這個日誌文件被複制到另一個目的地並被刪除。日誌記錄框架繼續工作,但日誌不會寫入日誌文件,因爲它被刪除。有什麼辦法可以告訴Log4j重新創建文件並不斷將日誌寫入日誌文件。Log4j FileAppender重新創建刪除的文件
最好的問候, 拉希德
我學習的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;
}
我想有兩個解決方法
感謝您提供此代碼snipet。您提出的第一個解決方法並不夠簡單。我想我會嘗試實施您建議的第二種解決方法。您提到的方法getLog和getInstance,它們位於哪個類中? –
確保你可以在你的log4j文件
log4j.appender.rollingFile.File=D:/myapp/mylog.log
聲明此行如果你已經宣佈它,您日誌文件可以刪除或替換,只要你喜歡。然後重新運行程序,並在此路徑中創建新的日誌文件。
感謝您的建議,但它不適合我。我不想重新啓動應用程序。 –
您不需要重新啓動。您可以配置RollingFileAppender以創建新的日誌文件。這意味着log4j會在它們「滿」時重命名並移動它們,然後它會創建一個新的日誌文件。 –
我不明白這將如何爲我工作。正如你所說,當現有文件已滿時,將創建新文件。在我的情況下,我需要在刪除現有文件時創建新文件。 –
嘗試這個類
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
我已經試過了。它可以工作,但是會有明顯的性能下降。用這樣的appender記錄大概慢10倍。 –
試試這個。我現在沒有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.");
}
}
}
}
}
你好。謝謝。實際上,性能下降並不那麼顯着。我檢查了Apache Tomcat。在那裏的訪問日誌實現中使用類似的代碼。 –
的[Log4j的不會重新上刪除文件]可能的複製(https://stackoverflow.com/questions/9937796/log4j-does-not-recreate-files-on-deletion) – Lambart