[英]Log4j RollingFileAppender not working as expected
我正在開發一個應用程序,該應用程序必須根據大小維護日志,並且按照下面的代碼片段進行操作,我期望的是每10MB之后,一個新的日志記錄器說Mylog.1.log,Mylog.2 .log等將被創建,不幸的是它沒有發生。
盡管它創建了Mylog.1.log,但發布了刪除Mylog.1.log並創建Mylog.2.log的信息,但這不是預期的行為。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true"
xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
<param name="append" value="true"/>
<param name="file" value="E:/logs/Mylog.log"/>
<param name="MaxFileSize" value="10MB"/>
<param name="MaxBackupIndex" value="10"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="fileAppender"/>
</root>
環境操作系統:Windows 7應用程序服務器:IBM Websphere 8編程語言:Java
Google搜索了很多,結果似乎沒有收獲,任何幫助都值得贊賞。 謝謝。
我們的以下log4j配置在生產中運行良好。 使用的log4j版本是1.2.15
<appender name="FILE_JVM" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="E:/logs/app.log"/>
<param name="maxFileSize" value="20MB"/>
<param name="maxBackupIndex" value="50"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</layout>
</appender>
與您比較的只是參數maxFileSize和maxBackupIndex的情況不同。
我使用log4j 1.2.17嘗試了一個示例,並能夠查看日志目錄中的app.log.1,app.log.2,app.log.3等文件的內容。 嘗試在最后運行它,看看可能會丟失什么。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</layout>
</appender>
<appender name="FILE_JVM" class="org.apache.log4j.RollingFileAppender">
<param name="file" value="E:/Sundry/Projects/Log4jEmailSample/logs/app.log"/>
<param name="maxFileSize" value="1MB"/>
<param name="maxBackupIndex" value="50"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</layout>
</appender>
<!-- the ROOT Logger -->
<root>
<level value="INFO"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_JVM"/>
</root>
</log4j:configuration>
在獨立應用程序下方
import org.apache.log4j.Logger;
import java.util.concurrent.TimeUnit;
public class MainApp {
public static void main(String[] args) {
Logger logger = Logger.getLogger(MainApp.class);
while (true) {
logMessages(logger);
try {
TimeUnit.MILLISECONDS.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
private static void logMessages(Logger logger) {
logger.info("Info message");
}
}
我在類路徑中僅有的jar是log4j-1.2.17.jar。 它對您有用嗎?
這是因為在RollingFileAppender.java
rollOver()
方法中,當前日志文件的重命名失敗。
renameSucceeded = file.renameTo(target);
在這里, file.renameTo(target)
返回false。 要解決此問題,請覆蓋該方法並添加自定義代碼以解決此問題。 一種方法是在上述語句后添加以下代碼。
if(!renameSucceeded) //custom code begins
{
try
{
FileUtils.copyFile(file, target);
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
bw.write("");
bw.flush();
bw.close();
renameSucceeded = true;
}
catch (IOException e) {
renameSucceeded = false;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.