Продвинутое управление уровнем логирования в Java

Часто сталкивались с такой ситуацией: в логах Java-приложения много лишней информации и трудно найти нужную запись?

Решается обычно правкой лог левела для отдельных пакеджей/классов в конфигурации логирования. Но что если мы хотим перенастроить лог левелы, с которыми пишутся записи в лог, для конкретных сторонних библиотек, пакетов и классов?

В Log4j2 есть два варианта решения этой задачи: 1) используя готовый RewriteAppender 2) переопределяя Log4jLogEventFactory своей реализацией

Рассмотрим 1-й вариант:

В спеке достаточно подробно разобрана настройка RewriteAppender и конкретно LoggerNameLevelRewritePolicy: https://logging.apache.org/log4j/2.x/manual/appenders.html#loggernamelevelrewritepolicy

Недостаток этого подхода: каждый аппендер нужно обернуть в RewriteAppender со всеми настройками полиси.

2-й подход позволяет глобально решить проблему переопределения лог левела (без дублирования настроек), однако он несколько более сложный и требует разработки класса, реализующего логику RewritePolicy:

Создаем класс, который реализует интерфейс LogEventFactory (https://logging.apache.org/log4j/2.x/javadoc/log4j-core/org/apache/logging/log4j/core/impl/LogEventFactory.html), например, наследуясь от класса ReusableLogEventFactory. В методе createEvent() меняем level для loggerName на требуемый - логика может быть сколь угодно продвинутой, все зависит от ваших правил. Однако сложные вычисления могут затормозить систему логирования, так что не следует перебарщивать с реализацией.

Далее определяем наш класс через системную проперть Log4jLogEventFactory или в файле log4j2.component.properties, который должен находится в classpath.

Для Logback нет готовых решений, но можно применять похожие на 2-й вариант подходы, используя: 1) MessageConverter (https://stackoverflow.com/questions/49244282/logback-how-to-change-message-in-logging-event-before-appending) или 2) TurboFilter (https://www.sedooe.com/2017/04/intercepting-and-modifying-logs-in-logback/)

Теперь в вашем арсенале есть продвинутые решения для управления уровнем логирования в Java 😉

#log4j2 #logback #logging