Политика запуска по времени в 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.
Вам нужно изменить шаблон имени файла, если вы хотите его создать каждый час.