2014-12-05 91 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