Продвинутое управление уровнем логирования в 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 😉
· 05.07
Спасибо
ответить
коммент удалён