Как совместить ежедневную ротацию журнала log4j с ротацией на основе файлов и maxbackup?

Я хочу настроить следующие вещи для log4j:

  • ежедневная ротация лог-файла
  • максимальный размер файла журнала 100 МБ (переключаться, когда журнал достигает предела).
  • сжимать файлы журналов с ежедневной ротацией
  • храните сжатые файлы журналов только в течение 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="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t][%c{1}:%L] %m%n" />
            </layout>
        </appender>
        
        <root>
            <priority value="INFO" />
            <appender-ref ref="RollingAppender" />
        </root>
    </log4j:configuration>

person Jürgen    schedule 16.04.2021    source источник


Ответы (1)


Даже если вы используете apache-log4j-extras (как кажется), невозможно получить такую ​​конфигурацию из коробки. Чего вам не хватает, так это TriggeringPolicy, который вызывает перенос каждый день: TimeBasedRollingPolicy работает корректно, только если используется как RollingPolicy, так и TriggeringPolicy. В противном случае он запускает перенос каждого сообщения.

Поэтому вам нужно создать такой класс:

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="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t][%c{1}:%L] %m%n" />
    </layout>
  </appender>
  <root>
    <priority value="INFO" />
    <appender-ref ref="RollingAppender" />
  </root>
</log4j:configuration>

Примечание. Как вы, наверное, знаете, Log4j 1.x достиг своего конца -life 6 лет назад. Его преемник Log4j 2.x имеет все необходимые политики запуска (см. документация), если вы хотите выполнить обновление.

person Piotr P. Karwasz    schedule 16.04.2021