【问题标题】:How do you get log4j to roll files based on date and size?如何让 log4j 根据日期和大小滚动文件?
【发布时间】:2010-10-22 03:40:42
【问题描述】:

所以 log4j 带有两个现有的日志滚轮:RollingFileAppender 和 DailyRollingFileAppender。有没有人听说过一个可以同时做前者的 appender?

我需要一个附加器,它会根据文件大小滚动日志文件,但也会将当前日期附加到它。

我一直在考虑创建自己的 appender,但如果已经创建了一个,为什么不节省时间并使用那个?

【问题讨论】:

    标签: log4j


    【解决方案1】:

    看起来您想要混合使用 http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.htmlhttp://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/RollingFileAppender.html

    您必须自己编写代码。好消息是:您只需“合并”这些类功能,无需“低级”新代码。

    【讨论】:

    • 我最终创建了自己的 FileAppender,它只是一个 RollingFileAppender,它在每个滚动文件上添加当前日期。
    【解决方案2】:

    我知道这篇文章有点晚了,但你可以试试 TimeAndSizeRollingAppender。它在 Apache 2.0 许可下免费提供,从www.simonsite.org.uk 下载。

    【讨论】:

      【解决方案3】:

      “companions”项目中的 Log4J Extras 提供了一系列滚动策略,包括您正在寻找的内容。

      APIDoc:http://logging.apache.org/log4j/extras/apidocs/index.html 主页:http://logging.apache.org/log4j/extras/

      【讨论】:

      • 这些是最近的吗?这很酷。 org.apache.log4j.rolling 包看起来非常有用。谢谢! :)
      【解决方案4】:

      使用 Log4j

      正如@JavaJigs 所说,可以使用Log4j 的附加功能。

      首先,如果您使用的是 Maven,请将其添加为依赖项,记住使用相同的 log4j 版本,以避免任何类型的冲突。

      <!-- you should already have something like this -->
      <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
      </dependency>
      
      <!-- add this one, please note the version is the same than log4j -->
      <dependency>
          <groupId>log4j</groupId>
          <artifactId>apache-log4j-extras</artifactId>
          <version>1.2.17</version>
      </dependency>
      

      然后,设置一个 appender 来使用这两种滚动。这是一个快速而肮脏的示例,每分钟滚动一次和/或当日志文件的大小超过 1000 字节时滚动。

      <appender name="rollout5" class="org.apache.log4j.rolling.RollingFileAppender">
          <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
              <param name="ActiveFileName" value="log4j-current.log" />
              <param name="FileNamePattern" value="log4j-%d{HH-mm}.%i.log.gz" />
          </rollingPolicy>
          <triggeringPolicy class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
              <param name="MaxFileSize" value="1000" />
          </triggeringPolicy>
          <layout class="org.apache.log4j.PatternLayout">
              <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n" />
          </layout>
      </appender>
      

      像往常一样将 appender 添加到记录器。

      如果你运行应用程序,你应该会得到类似的东西......

      log4j-current.log
      log4j-18-13.1480266729211.log.gz
      log4j-18-12.1480266729095.log.gz
      log4j-18-12.1480266729123.log.gz
      

      显然,文件的数量及其名称取决于您的应用程序的日志记录方式。

      如您所见,%i 占位符被替换为一种随机但不断增加的数字。我无法找到一种方法将其替换为从 0 开始的数字。不过,按字母顺序列出的此类文件应与其历史顺序一致。

      其他想法

      我知道你明确提到了 log4j。但是,如果可以的话,为什么不评估迁移到 log4j2 呢? In this log4j2 piece of doc 有几个示例似乎适合您的需求。

      【讨论】:

      • 我怀疑 %i 数字是时间戳。我现在得到的与您的一个示例之间的差异非常接近 60 天(以秒计)。
      【解决方案5】:

      回复太晚了。但希望这会对某人有所帮助。

      将 log4j 依赖添加到您的 pom.xml 文件中

         <dependency>
              <groupId>log4j</groupId>
              <artifactId>log4j</artifactId>
              <version>1.2.17</version>
          </dependency>
      

      获取此 FileAppender 实现的副本。感谢此文件的作者。

      http://haobangshou.googlecode.com/svn/trunk/hbs/APPLICATION/server/common/src/com/hbs/common/appender/TimeSizeRollingFileAppender.java
      

      将此 log4j.xml 文件放在资源文件夹中

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
      <log4j:configuration>
      <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
          <layout class="org.apache.log4j.PatternLayout">
              <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%p] %c{1} %m%n"/>
          </layout>
      </appender> 
      
      <appender name="debug" class="com.myproject.log.TimeSizeRollingFileAppender">
          <param name="File" value="log/debug.log"/>
          <param name="MaxBackupIndex" value="300"/>
          <param name="Encoding" value="GB2312"/>
          <!--CHANGE THIS TO A LARGER SIZE EG : 20MB. USE 1MB TO TEST IF THE SETTING WORKS.-->
          <param name="MaxFileSize" value="1MB"/>
          <param name="DatePattern" value="'.'yyyy-MM-dd"/>
          <layout class="org.apache.log4j.PatternLayout">
              <param name="ConversionPattern" value="%d{ISO8601} %p [%c] - [%m]%n"/>
          </layout>
      </appender>
      
      <!--CHANGE name TO ROOT PACKAGE NAME OF YOUR PROJECT THAT YOU WANT TO LOG.-->
      <logger name="com.myproject" additivity="false">
          <level value="debug"/>
          <appender-ref ref="consoleAppender"/>
          <appender-ref ref="debug"/>
      </logger>
      
      
      <logger name="org.springframework" additivity="false">
          <level value="debug"/>
          <appender-ref ref="consoleAppender"/>
          <appender-ref ref="debug"/>
      </logger>
      
      <logger name="org.hibernate" additivity="false">
          <level value="debug"/>
          <appender-ref ref="consoleAppender"/>
          <appender-ref ref="debug"/>
      </logger>
      
      <root>
          <priority value="INFO"></priority>
          <appender-ref ref="consoleAppender"/>
          <appender-ref ref="debug"/>
       </root>
      

      做一个快速测试:

      import org.apache.log4j.Logger;
      
      public class Main {
      
          static public void main(String[] args) {
              Logger log = Logger.getLogger(Main.class);
              for(int i = 0; i < 10000; i ++)
                  log.info("Testing log");
              }
      }
      

      完成!!

      【讨论】:

      【解决方案6】:

      我们使用您看到的课程here。它按照您的描述工作并扩展了 FileAppender。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多