提问

如何将log4j日日志旋转与基于文件大小的旋转和最大备份结合起来?

Stack Overflow用户
提问于 2021-04-16 11:06:41
EN

我想为log4j配置以下内容:

  • 每天旋转日志文件
  • 最大日志文件大小100 max (当日志达到限制时旋转)。
  • 压缩每日旋转日志文件
  • 只保留压缩日志文件7天。
  • 日志应该使用特定的模式编写。
  • 日志级信息

先决条件: OS是windows,log4j版本1.1.x,xml配置格式

这就是我所拥有的:

代码语言: javascript
复制
    <?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="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t][%c{1}:%L] %m%n" />
            </layout>
        </appender>
            <priority value="INFO" />
            <appender-ref ref="RollingAppender" />
        </root>
    </log4j:configuration>
1 518 0 票数 1
EN

回答 1

Stack Overflow用户

发布于 2021-04-16 20:46:10

即使您使用 apache-log4j-extras (看起来是这样),也不可能立即获得这样的配置。您缺少的是一个每天都会导致滚动的 TriggeringPolicy :只有当 TimeBasedRollingPolicy 同时用作 RollingPolicy TriggeringPolicy 时,它才能正常工作。否则,它会触发每条消息的滚动。

因此,您需要创建这样一个类:

代码语言: javascript
复制
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;
}

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

代码语言: javascript
复制
<?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="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t][%c{1}:%L] %m%n" />
    </layout>