简体   繁体   English

Log4j RollingFileAppender无法按预期工作

[英]Log4j RollingFileAppender not working as expected

I'm just working on an application where I gotta maintain logs based on size, and I have done so as below code snippet, what I was expecting was after every 10MB, a new log roller say Mylog.1.log, Mylog.2.log and so on will be created, unfortunately its not happening. 我正在开发一个应用程序,该应用程序必须根据大小维护日志,并且按照下面的代码片段进行操作,我期望的是每10MB之后,一个新的日志记录器说Mylog.1.log,Mylog.2 .log等将被创建,不幸的是它没有发生。

Though it creates Mylog.1.log, post that its removing Mylog.1.log and creating Mylog.2.log, this is not expected behaviour. 尽管它创建了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>

Environment OS : Windows 7 Application Server : IBM Websphere 8 Programming language : java 环境操作系统:Windows 7应用程序服务器:IBM Websphere 8编程语言:Java

Googled a lot, result doesnt seems fruitful, any help is appreciated. Google搜索了很多,结果似乎没有收获,任何帮助都值得赞赏。 Thanks. 谢谢。

We have the below log4j configuration running well in production. 我们的以下log4j配置在生产中运行良好。 The log4j version used is 1.2.15 使用的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>

Comparing it with your I just the case of params maxFileSize & maxBackupIndex different. 与您比较的只是参数maxFileSize和maxBackupIndex的情况不同。

I tried a sample with log4j 1.2.17 and was able to see the logs getting rolled over with app.log.1, app.log.2, app.log.3 and so on files in my logs directory. 我使用log4j 1.2.17尝试了一个示例,并能够查看日志目录中的app.log.1,app.log.2,app.log.3等文件的内容。 Try running it at your end and see what could be missing. 尝试在最后运行它,看看可能会丢失什么。

<?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>

Below the standalone app 在独立应用程序下方

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");
    }

}

The only jar I have in my class path is log4j-1.2.17.jar. 我在类路径中仅有的jar是log4j-1.2.17.jar。 Does it work at your end? 它对您有用吗?

This happens because in rollOver() method in RollingFileAppender.java , renaming of the current log file is failing. 这是因为在RollingFileAppender.java rollOver()方法中,当前日志文件的重命名失败。

renameSucceeded = file.renameTo(target);

Here file.renameTo(target) returns false. 在这里, file.renameTo(target)返回false。 To solve this, override the method and add custom code to fix the issue. 要解决此问题,请覆盖该方法并添加自定义代码以解决此问题。 One way to do is add the below code after the above statement. 一种方法是在上述语句后添加以下代码。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM