2014-12-05 112 views
1

我只是在一個應用程序的工作,我得保持基於大小的日誌,我已經這樣做了如下的代碼片段,我所期待的是每10MB後,一個新的日誌滾筒說Mylog.1.log,Mylog.2.log等將被創建,不幸的是它沒有發生。Log4j的RollingFileAppender進行工作不正常

儘管它創建了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搜索了很多,結果犯規似乎卓有成效,任何幫助表示讚賞。謝謝。

+0

爲什麼不使用log4j2? – 2014-12-05 01:24:34

+0

感謝您的回覆肖恩,我不能改變環境,有些如何處理log4j本身 – Inayathulla 2014-12-05 02:10:32

回答

1

我們有以下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> 

與我剛則params的情況相比,它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"); 
    } 

} 

唯一的罐子我在我的類路徑是log4j的-1.2.17.jar。它是否在你的最後?

+0

沒有運氣安迪!我是否還需要調整log4j.dtd中的其他內容? – Inayathulla 2014-12-05 07:12:03

+0

沒有dtd看起來不錯。你有什麼版本的log4j? – 2014-12-05 08:50:50

+0

其log4j-1.2.17 – Inayathulla 2014-12-05 09:00:23

0

發生這種情況的原因是在rollOver()方法RollingFileAppender.java中,重命名當前日誌文件失敗。

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; 
     } 
     } 
+0

@AlBlue:感謝編輯:) – 2016-06-16 10:43:30