- Home »

Пример настройки Log4j2 — конфигурация, уровни и аппендеры
Логирование — это хлеб для каждого девопса и бэкенд-разработчика. Без нормальных логов отлаживать продакшн — это как искать иголку в стогу сена с завязанными глазами. Log4j2 — это не просто очередной фреймворк для логирования, это полноценная система мониторинга и отладки приложений, которая может спасти тебя от множества бессонных ночей.
Сегодня разберём настройку Log4j2 от А до Я. Ты узнаешь, как правильно сконфигурировать уровни логирования, настроить аппендеры под разные задачи, и самое главное — как сделать это быстро и без лишних танцев с бубном. Статья подойдёт тем, кто хочет настроить логирование на своём сервере, будь то VPS или выделенный сервер.
Что такое Log4j2 и зачем он нужен
Log4j2 — это наследник легендарного Log4j, но с кардинально переписанной архитектурой. Основные преимущества:
- Асинхронность из коробки — производительность в разы выше классического Log4j
- Гибкая конфигурация — поддержка XML, JSON, YAML и properties форматов
- Автоматическая перезагрузка конфигурации — не нужно рестартить приложение
- Богатая экосистема аппендеров — от простых файлов до Kafka и ElasticSearch
- Лучшая защита от атак — после нашумевшей CVE-2021-44228 безопасность стала приоритетом
Базовая настройка Log4j2
Начнём с самого простого. Создаём файл log4j2.xml
в папке src/main/resources
(или в classpath твоего приложения):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Эта конфигурация выводит логи в консоль с базовым форматированием. Параметр status="WARN"
показывает только критичные ошибки самого Log4j2.
Уровни логирования: от TRACE до FATAL
Log4j2 поддерживает стандартную иерархию уровней:
Уровень | Назначение | Когда использовать |
---|---|---|
TRACE | Максимально детальная информация | Отладка сложных алгоритмов |
DEBUG | Отладочная информация | Разработка и тестирование |
INFO | Общая информация о работе | Штатная работа приложения |
WARN | Предупреждения | Потенциальные проблемы |
ERROR | Ошибки | Ошибки, не останавливающие работу |
FATAL | Критические ошибки | Ошибки, приводящие к остановке |
Пример настройки разных уровней для разных пакетов:
<Loggers>
<Logger name="com.mycompany.database" level="DEBUG"/>
<Logger name="com.mycompany.security" level="WARN"/>
<Logger name="org.springframework" level="INFO"/>
<Logger name="org.hibernate" level="ERROR"/>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
Аппендеры: куда сохранять логи
File Appender — базовый файловый вывод
<File name="FileAppender" fileName="logs/application.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%level] %c{1} - %msg%n"/>
</File>
RollingFile Appender — ротация логов
Самый популярный аппендер для продакшена. Автоматически архивирует старые логи:
<RollingFile name="RollingFileAppender"
fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
Здесь логи архивируются каждый день или при достижении 100MB, храним максимум 30 файлов.
Async Appender — асинхронное логирование
Для высоконагруженных приложений критично не блокировать основной поток:
<Async name="AsyncAppender">
<AppenderRef ref="RollingFileAppender"/>
<BlockingQueueFactory>
<LinkedTransferQueue capacity="1024"/>
</BlockingQueueFactory>
</Async>
Полная конфигурация для продакшена
Вот пример рабочей конфигурации, которую можно использовать на сервере:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
<Property name="LOG_PATH">/var/log/myapp</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<RollingFile name="InfoAppender"
fileName="${LOG_PATH}/info.log"
filePattern="${LOG_PATH}/info-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
<RollingFile name="ErrorAppender"
fileName="${LOG_PATH}/error.log"
filePattern="${LOG_PATH}/error-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<DefaultRolloverStrategy max="60"/>
</RollingFile>
<Async name="AsyncInfo">
<AppenderRef ref="InfoAppender"/>
</Async>
<Async name="AsyncError">
<AppenderRef ref="ErrorAppender"/>
</Async>
</Appenders>
<Loggers>
<Logger name="com.mycompany" level="DEBUG" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="AsyncInfo"/>
<AppenderRef ref="AsyncError"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="AsyncInfo"/>
<AppenderRef ref="AsyncError"/>
</Root>
</Loggers>
</Configuration>
Продвинутые возможности
Фильтры
Можно настроить сложную фильтрацию логов:
<Filters>
<MarkerFilter marker="SECURITY" onMatch="ACCEPT" onMismatch="DENY"/>
<RegexFilter regex=".*password.*" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
Интеграция с ELK Stack
Для отправки логов в Elasticsearch:
<Socket name="ElasticsearchAppender" host="localhost" port="9200" protocol="TCP">
<JsonLayout compact="true" eventEol="true"/>
</Socket>
Сравнение с альтернативами
Фреймворк | Производительность | Гибкость | Сложность настройки |
---|---|---|---|
Log4j2 | Очень высокая | Максимальная | Средняя |
Logback | Высокая | Высокая | Низкая |
JUL | Низкая | Низкая | Очень низкая |
SLF4J | Зависит от бэкенда | Средняя | Низкая |
Практические советы и частые ошибки
✅ Что делать правильно:
- Используй параметризованные сообщения:
logger.info("User {} logged in", username)
- Настрой ротацию логов — диск не резиновый
- Разделяй логи по уровням — ошибки в отдельный файл
- Используй асинхронные аппендеры для высоконагруженных приложений
- Настрой мониторинг размера логов — лучше через Prometheus + Grafana
❌ Частые ошибки:
- Логирование в синхронном режиме — убивает производительность
- Слишком детальное логирование в продакшене — DEBUG на проде = медленная работа
- Отсутствие ротации — рано или поздно закончится место на диске
- Логирование паролей и токенов — используй фильтры
- Игнорирование настройки JVM — для Log4j2 нужно достаточно памяти
Настройка JVM для Log4j2
Для оптимальной работы добавь эти параметры JVM:
-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
-Dlog4j2.asyncQueueFullPolicy=Discard
-Dlog4j2.discardThreshold=INFO
-DAsyncLogger.RingBufferSize=262144
Мониторинг и отладка
Для отладки самого Log4j2 включи внутренние логи:
<Configuration status="DEBUG">
Для мониторинга производительности используй JMX:
-Dcom.sun.management.jmxremote
-Dlog4j2.enable.threadlocals=true
Скрипты для автоматизации
Скрипт для очистки старых логов:
#!/bin/bash
# cleanup-logs.sh
LOG_DIR="/var/log/myapp"
find $LOG_DIR -name "*.log.gz" -mtime +30 -delete
find $LOG_DIR -name "*.log" -size +500M -exec gzip {} \;
Скрипт для мониторинга размера логов:
#!/bin/bash
# monitor-logs.sh
LOG_SIZE=$(du -sh /var/log/myapp | cut -f1)
echo "log_size_mb $(echo $LOG_SIZE | sed 's/M//')" | nc -w 1 -u monitoring-server 8125
Интеграция с Docker
Dockerfile для приложения с Log4j2:
FROM openjdk:11-jre-slim
COPY target/myapp.jar /app/
COPY log4j2.xml /app/
WORKDIR /app
VOLUME ["/var/log/myapp"]
CMD ["java", "-Dlog4j.configurationFile=log4j2.xml", "-jar", "myapp.jar"]
Интересные факты и нестандартные применения
- Log4j2 может логировать в базу данных — есть JDBC аппендер
- Поддержка Lambda выражений — можно использовать для ленивого вычисления сообщений
- Встроенная поддержка structured logging — JSON из коробки
- Можно писать собственные аппендеры — например, для отправки в Slack
- Поддержка MDC (Mapped Diagnostic Context) — отлично для трассировки запросов
Безопасность
После Log4Shell уязвимости обязательно:
- Используй версию 2.17.0 или выше
- Отключи lookup’ы:
-Dlog4j2.formatMsgNoLookups=true
- Настрой фильтрацию входящих данных
- Регулярно обновляй зависимости
Заключение и рекомендации
Log4j2 — мощный инструмент, который при правильной настройке может значительно упростить жизнь админа и разработчика. Основные рекомендации:
- Начни с простого — базовая конфигурация с Console и RollingFile аппендерами
- Постепенно добавляй сложность — асинхронность, фильтры, кастомные аппендеры
- Обязательно настрой ротацию — место на диске не бесконечно
- Следи за производительностью — логирование не должно тормозить приложение
- Регулярно обновляй — безопасность критична
Для небольших проектов достаточно базовой конфигурации. Для высоконагруженных систем обязательно используй асинхронные аппендеры и настраивай JVM параметры. И помни — хорошие логи это половина успеха в отладке продакшена.
Полезные ссылки:
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.