Как настроить отправку и ротацию логов в Java-приложении?

«Как настроить отправку и ротацию логов в Java-приложении?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Настройка логгирования в Java обычно выполняется с помощью фреймворков Logback (по умолчанию в Spring Boot) или Log4j2. Основные задачи — запись в файлы с ротацией и отправка в централизованные системы.

Типичная конфигурация (Logback):

  1. Ротация логов: Создание новых файлов по размеру или дате для предотвращения переполнения диска.
  2. Форматирование: Настройка шаблона вывода (%d{yyyy-MM-dd} %msg%n).
  3. Асинхронность: Использование AsyncAppender для минимизации влияния на производительность приложения.
  4. Направление: Отправка логов в внешние системы (ELK, Splunk) через аппендеры для Logstash, Syslog или Kafka.

Пример logback-spring.xml для ротации по размеру и дате:

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/app.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <queueSize>512</queueSize>
        <appender-ref ref="FILE" />
    </appender>

    <root level="INFO">
        <appender-ref ref="ASYNC" />
    </root>
</configuration>

Почему так? Ротация по размеру и дате (SizeAndTimeBasedRollingPolicy) — лучшая практика, так как она контролирует и размер отдельных файлов, и общий срок хранения. Асинхронная запись защищает поток выполнения приложения от блокировок при проблемах с вводом-выводом.