如何将 log4j 每日日志轮换与基于文件大小的轮换和最大备份相结合?

Posted

技术标签:

【中文标题】如何将 log4j 每日日志轮换与基于文件大小的轮换和最大备份相结合?【英文标题】:How to combine log4j daily log rotation with filesize based rotation and maxbackup? 【发布时间】:2021-07-11 09:53:36 【问题描述】:

我想为 log4j 配置以下内容:

每天轮换日志文件 最大日志文件大小 100MB(当日志达到限制时轮换)。 压缩每日轮换的日志文件 仅将压缩日志文件保留 7 天。 日志应该按照一定的模式写 日志级别信息

前提条件:操作系统为windows,log4j版本1.1.x,xml配置格式

这就是我所拥有的:

    <?xml version="1.0"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="RollingAppender" class="org.apache.log4j.rolling.RollingFileAppender">
            <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
                    <param name="ActiveFileName" value="logs/app.log"/>
            </rollingPolicy>
            
            <layout class="org.apache.log4j.EnhancedPatternLayout">
                    <param name="ConversionPattern" value="%dyyyy-MM-dd HH:mm:ss.SSS %-5p [%t][%c1:%L] %m%n" />
            </layout>
        </appender>
        
        <root>
            <priority value="INFO" />
            <appender-ref ref="RollingAppender" />
        </root>
    </log4j:configuration>

【问题讨论】:

【参考方案1】:

即使您使用apache-log4j-extras(看起来如此),也无法开箱即用地获得这样的配置。您缺少的是一个每天都会导致翻转的TriggeringPolicyTimeBasedRollingPolicy 只有在同时用作RollingPolicyTriggeringPolicy 时才能正常工作。否则,它会触发每条消息的翻转。

因此你需要像这样创建一个类:

public class DailyTrigerringPolicy implements TriggeringPolicy 

   private LocalDate lastDate;

   @Override
   public void activateOptions() 
      lastDate = LocalDate.now();
   

   @Override
   public boolean isTriggeringEvent(Appender appender, LoggingEvent event, String filename, long fileLength) 
      boolean result = !lastDate.equals(LocalDate.now());
      lastDate = LocalDate.now();
      return result;
   

并将您的配置转换为如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "https://raw.githubusercontent.com/apache/log4j/trunk/src/main/resources/org/apache/log4j/xml/log4j.dtd" >
<log4j:configuration>
  <appender name="RollingAppender" class="org.apache.log4j.rolling.RollingFileAppender">
    <param name="file" value="$catalina.base/logs/app.log" />
    <!-- Rolls logs over and compresses the old ones -->
    <rollingPolicy class="org.apache.log4j.rolling.FixedWindowRollingPolicy">
      <param name="fileNamePattern" value="$catalina.base/logs/app.%i.log.gz" />
      <!-- These are default values: keeps up to 7 old logs
      <param name="minIndex" value="1" />
      <param name="maxIndex" value="7" />
       -->
    </rollingPolicy>
    <!-- Triggers a rollover whenever one of its child policies does. -->
    <triggeringPolicy class="org.apache.log4j.rolling.CompositeTriggeringPolicy">
      <!-- Triggers a rollover when the file size exceeds 100 MiB -->
      <triggeringPolicy class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
        <param name="maxFileSize" value="104857600" />
      </triggeringPolicy>
      <!-- This is the class above: triggers a rollover once a day-->
      <triggeringPolicy class="com.example.DailyTrigerringPolicy" />
    </triggeringPolicy>
    <layout class="org.apache.log4j.EnhancedPatternLayout">
      <param name="ConversionPattern" value="%dyyyy-MM-dd HH:mm:ss.SSS %-5p [%t][%c1:%L] %m%n" />
    </layout>
  </appender>
  <root>
    <priority value="INFO" />
    <appender-ref ref="RollingAppender" />
  </root>
</log4j:configuration>

备注:您可能知道,Log4j 1.x 在 6 年前达到了end-of-life。如果您愿意升级,它的后续 Log4j 2.x 具有您需要的所有触发策略(参见documentation)。

【讨论】:

以上是关于如何将 log4j 每日日志轮换与基于文件大小的轮换和最大备份相结合?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 中的多个日志文件和日志轮换

PostgreSQL 日志轮换大小达到文件限制

如何将我自己的日志添加到 Amazon Elastic Beanstalk 上的日志轮换/S3 备份?

log4j - log-rotation 没有清除 rotator 日志

轮换时如何避免约束冲突?

如何在通过 log4j 创建新日志文件时将日志添加到 Syslog?