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-решения — плюс.