Home » Пример настройки Log4j2 — конфигурация, уровни и аппендеры
Пример настройки Log4j2 — конфигурация, уровни и аппендеры

Пример настройки 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 параметры. И помни — хорошие логи это половина успеха в отладке продакшена.

Полезные ссылки:


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked