【问题标题】:Log4j RollingFileAppender not working as expectedLog4j RollingFileAppender 未按预期工作
【发布时间】:2014-12-05 00:52:00
【问题描述】:

我正在开发一个应用程序,我必须根据大小维护日志,我已经按照下面的代码 sn-p 完成了这项工作,我期望的是每 10MB 之后,一个新的日志滚轮说 Mylog.1。日志,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

谷歌了很多,结果似乎没有结果,感谢任何帮助。谢谢。

【问题讨论】:

  • 你为什么不用log4j2?
  • 感谢您的回复肖恩,我无法改变环境,有些如何处理 log4j 本身

标签: java log4j websphere


【解决方案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");
    }

}

我的类路径中唯一的 jar 是 log4j-1.2.17.jar。它对你有用吗?

【讨论】:

  • 安迪不走运!我还需要调整 log4j.dtd 中的其他内容吗?
  • 不,dtd 看起来不错。你有什么版本的 log4j?
  • 同意安迪!我的类似于你的代码。某处它被搞砸了:(
  • 您是否复制了上面的代码并将其作为独立应用程序运行在您的终端?
  • 我做到了,并且在独立运行 :),我怀疑我的 websphere 正在扼杀这种行为。非常感谢帮助我缩小问题。现在要再问一个特定于 websphere 行为的问题。跨度>
【解决方案2】:

这是因为在RollingFileAppender.java 中的rollOver() 方法中,当前日志文件的重命名失败。

renameSucceeded = file.renameTo(target);

这里file.renameTo(target) 返回错误。要解决此问题,请覆盖该方法并添加自定义代码来解决此问题。一种方法是在上述语句之后添加以下代码。

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

【讨论】:

    猜你喜欢
    • 2021-06-04
    • 2022-01-24
    • 2015-05-11
    • 2020-05-15
    • 2014-10-31
    • 2018-02-12
    • 2014-01-20
    • 2015-01-13
    • 2013-08-01
    相关资源
    最近更新 更多