Gymterview
middle

Как устроено логирование в Docker?

Docker перехватывает потоки stdout и stderr процесса внутри контейнера и направляет их в систему логирования через настраиваемый драйвер.

Просмотр логов

Пример
docker logs myapp              # Все логи
docker logs -f myapp           # Следить в реальном времени (follow)
docker logs --tail 100 myapp   # Последние 100 строк
docker logs --since 2h myapp   # Логи за последние 2 часа
docker logs --timestamps myapp # С временными метками

Драйверы логирования (logging drivers)

Драйвер Описание
json-file По умолчанию. Хранит логи в JSON-файлах на хосте
local Оптимизированный формат хранения
syslog Отправка в syslog
journald Отправка в systemd journal
fluentd Отправка в Fluentd
awslogs Отправка в Amazon CloudWatch
gelf Отправка в Graylog (GELF формат)
Пример
# Указать драйвер при запуске
docker run --log-driver=json-file \
           --log-opt max-size=10m \
           --log-opt max-file=3 \
           my-spring-app

Настройка в docker-compose.yml

Пример
services:
  app:
    image: my-spring-app
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

Рекомендации для Java-приложений

  • Направляйте логи в stdout/stderr вместо файлов. В Spring Boot для этого достаточно не настраивать file appender
  • Используйте структурированное логирование (JSON) для удобства парсинга системами агрегации (ELK, Loki)
  • Настройте ограничение размера логов (max-size, max-file), чтобы не переполнить диск
  • В production используйте централизованные системы логирования (ELK Stack, Grafana Loki, Graylog)
Пример JSON-логирования в Spring Boot (logback-spring.xml)
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

На собеседовании: ключевой принцип: приложение в контейнере должно писать логи в stdout/stderr, а не в файлы. Docker сам собирает эти потоки и направляет в настроенный драйвер. Обязательно упомяните max-size/max-file — без них логи могут заполнить диск хоста. Знание ELK/Loki как production-решения — плюс.