Slf4J / Log4J: Как использовать новый выходной файл для каждого регистратора, имя которого известно во время выполнения? - PullRequest
0 голосов
/ 17 апреля 2020

У меня следующий сценарий:

Я конвертирую кучу файлов, и мне нужно регистрировать каждое преобразование. Вывод должен быть сохранен вместе с преобразованным и оригинальным файлом. Мой план состоит в том, чтобы создать / получить регистратор из LoggerFactory с именем файла в качестве идентификатора (имя класса не подходит, поскольку оно всегда будет Converter.class). Поэтому каждый возвращаемый регистратор уникален. Затем я хочу, чтобы у каждого регистратора был свой файл appender для файла журнала. Эта информация доступна только во время выполнения, так как только тогда я знаю, какие файлы пользователь хочет преобразовать и где они должны быть сохранены. В идеале, все настроено в некотором конфигурационном файле, поэтому мне не нужно беспокоить мой код обертками и прочим и может просто использовать Slf4J.

Итак, есть ли способ получить имя регистратора (будет какой-то путь) в файле конфигурации и передать его в качестве выходного файла для appender?

1 Ответ

0 голосов
/ 17 апреля 2020

Это может звучать странно, но я бы предложил использовать 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 и затем вызывает пользовательскую политику запуска для выполнения ролловера.

...