Политика запуска по времени в log4j2

Я пытаюсь создавать новые файлы журналов на почасовой основе. Я использую TimeBasedTriggerringPolicy lo4j2 в RollingFileAppender. Ниже приведен пример кода конфигурации xml, который я взял с официального сайта log4j2.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
   <Appenders>
      <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
         <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
         </PatternLayout>
         <Policies>
            **
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            **
            <SizeBasedTriggeringPolicy size="250 MB" />
         </Policies>
      </RollingFile>
   </Appenders>
   <Loggers>
      <Root level="error">
         <AppenderRef ref="RollingFile" />
      </Root>
   </Loggers>
</Configuration>

В атрибуте interval я установил 1, что означает 1 час. Но все равно мой файл не катится каждые 1 час.

Пожалуйста, помогите мне найти какую-либо ошибку.

Примечание. Я включил бета9 log4j2 (который является последним)

Ответ 1

1 здесь указывает 1 день, а не 1 час. Я проверил вручную с более низкой конфигурацией.

<RollingFile name="T" fileName="/data_test/log/abc.log"
        filePattern="/data_test/log/abc-%d{MM-dd-yyyy}-%i.log">
        <PatternLayout>
            <Pattern>%d{ISO8601} %-5p [%t] (%F:%L) - %m%n</Pattern>
        </PatternLayout>
        <Policies>              
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            <SizeBasedTriggeringPolicy size="100 KB" />
        </Policies>
    </RollingFile>

Для ручного тестирования я меняю системную дату и время. Во-первых, попробуйте увеличить 1 час. Файлы журнала будут генерироваться, но не в соответствии с ожиданием. Затем измените системную дату, увеличьте ее на 1 день, а затем увидите результаты.

Предположим, что последний файл журнала (abc.log) в день 29 октября составляет 50 КБ. Размер конфигурации - 100 КБ. Если мы изменим день (увеличение на 1 день), а затем запустим. Затем последний файл будет переименован 29-Oct- (некоторый порядковый номер).log(файл 50 КБ при его копировании), и новый файл будет создан с помощью abc.log

Я пробовал это с помощью простого сервлета с настройкой ниже в web.xml

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>

сохранить log4j2.xml в папке src. log4j2.xml не загружается, если мы сохраняем его в пути к классам.

Ответ 2

Как упоминал Абид, значение интервала интерпретируется в контексте шаблона, который указан как часть файла filePattern. Он начинается с наименьшего номинала. Например, если шаблон содержит S, частота будет в миллисекундах. Он поддерживает шаблон даты, как подробно описано как часть SimpleDateFormat java doc http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Ответ 3

У вас есть не пустой файл журнала (в противном случае нет ничего, чтобы перевернуться)?

Обратите внимание, что даже если имя "TimeBased...", оно не будет перевернуться в указанное время, но в первом событии журнала, которое поступит после превышения порогового значения времени. Можете ли вы попробовать с помощью небольшой тестовой программы, которая регистрирует что-то через 61 минуту или около того, и посмотреть, все еще проблема?

Если он не перевернется с вышеуказанной тестовой программой, возможно, вы обнаружили ошибку. В этом случае, пожалуйста, поднимите его на трекер log4j. (Обязательно приложите тестовую программу, которую команда может использовать для воспроизведения проблемы).

Ответ 4

Документация Log4j:

interval → (integer). Как часто происходит опрокидывание на основе самой конкретной единицы времени в шаблоне даты. Например, с шаблоном даты с часами в качестве наиболее конкретного элемента и с шагом в 4 прокрутки будет происходить каждые 4 часа. Значение по умолчанию - 1.

Вам нужно изменить шаблон имени файла, если вы хотите его создать каждый час.