Это может звучать странно, но я бы предложил использовать RollingFileAppender с пользовательской политикой запуска и DirectWriteRolloverStrategy. Ваша пользовательская политика запуска всегда возвращает false в методе isTriggeringEvent. Вместо этого вы должны вызывать метод в политике запуска, который просто выполняет manager.rollover()
.
. Затем в атрибуте filePattern вы указываете шаблон для имени файла, которое вы хотите использовать. Вы можете использовать любой Log4j Lookup в имени (с 2 знаками доллара). Таким образом, вы можете поместить идентификатор в ThreadContext и использовать $${mdc:ID}
, чтобы получить его или создать собственный поиск. В этом случае вам не нужно связываться с именем регистратора - просто войдите, как обычно.
Например, ваша конфигурация lAppender может выглядеть следующим образом:
<RollingFile name="Rolling" filePattern="${LOG_DIR}/$${mdc:ID}.log" createOnDemand="true">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<MyTriggeringPolicy>
</RollingFile>
Тогда ваш Приложение прочитает ваш файл конфигурации и сохранит имя первого файла для преобразования, выполнив ThreadContext.put("ID", name);
. Когда он завершает работу с этим файлом и хочет перейти к следующему, он сохраняет следующее имя в ThreadContext и затем вызывает пользовательскую политику запуска для выполнения ролловера.