Почему выбрасывается исключение java.lang.IllegalStateException о некорректной дате в xml-файле log4j2?

Моя задача - сформировать конфигурационный XML-файл для log4j2 таким образом, чтобы:

  • логи писались каждый раз при запуске программы;
  • логи писались в папку, которая имеет имя равное текущей дате в формате год-месяц-день;
  • непосредственно файл с логами в формате txt имел имя, содержащее в себе год-месяц-день_часы-минуты.

Согласно официальной документации, вставка даты в XML-файл осуществляется с помощью lookup'ов, выглядит это следующим образом: $${date:MM-dd-yyyy}.

Найдя всю необходимую информацию на официальном сайте log4j в разделе конфигурации 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-$${date:yyyy-MM}-%i.log.gz">
  <PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  </PatternLayout>
  <Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="250 MB"/>
  </Policies>
</RollingFile>
  </Appenders>
  <Loggers>
<Root level="error">
  <AppenderRef ref="RollingFile"/>
</Root>
  </Loggers>
</Configuration>

Пытаюсь скомпилировать все файлы и получаю ошибку:

2021-04-23 00:28:40,421 main ERROR Could not create plugin of type class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile: java.lang.IllegalStateException: Pattern does not contain a date

Что в переводе означает:

паттерн filePattern не содержит дату

Почему при таком формате, выполненном в соответствии синтаксисом официальной документации, я получаю исключение java.lang.IllegalStateException.

Поискав в мануале на официальном сайте log4j2 я наткнулся на такой пример атрибута filePattern, в котором формат для папки (которая создается автоматически, в случае её отсутсвия) задается с помощью lookup'a DateFormat вот так /$${date:yyyy-MM}/, а для файла уже используется формат %d{MM-dd-yyyy}:

filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"

Почему для значения атрибута filePattern, с целью формирования имени файла, нельзя использоваться формат lookup'a DateFormat вида $${date:yyyy-MM}?


Ответы (0 шт):