Основы Docker: Логирование
Docker поддерживает несколько драйверов логирования (logging drivers), которые используются для управления тем, как Docker собирает и хранит логи контейнеров. Вы можете настроить драйвер логирования по умолчанию для Docker Daemon или указать драйвер для каждого контейнера при его запуске.
Драйверы логирования Docker
Вот некоторые из наиболее часто используемых драйверов логирования:
json-file(по умолчанию): Логи контейнеров записываются в JSON-файлы, расположенные на хост-машине в директории/var/lib/docker/containers/<container_id>. Каждый файл содержит метаданные и JSON-объект для каждой записи лога. Этот драйвер является драйвером по умолчанию.fluentd: Перенаправляет логи контейнеров на сервер Fluentd. Fluentd — это open-source сборщик данных логов, который позволяет агрегировать и перенаправлять логи в различные бэкенды.syslog: Перенаправляет логи контейнеров в системный журнал хост-машины (syslog).journald: Использует системный журнал systemd (journald) для хранения и управления логами контейнеров (доступно только на системах с systemd).gelf(Graylog Extended Log Format): Отправляет логи на сервер Graylog или другой сервер, поддерживающий формат GELF.awslogs: Отправляет логи в AWS CloudWatch Logs.gcplogs: Отправляет логи в Google Cloud Logging (ранее Stackdriver Logging).splunk: Отправляет логи на сервер Splunk.none: Отключает логирование для контейнера.
Настройка драйвера логирования по умолчанию
Вы можете настроить драйвер логирования по умолчанию для Docker Daemon, отредактировав файл конфигурации Docker (/etc/docker/daemon.json на Linux).
{
"log-driver": "fluentd",
"log-opts": {
"fluentd-address": "192.168.1.10:2422",
"tag": "{{.Name}}"
}
}После изменения файла daemon.json необходимо перезапустить Docker Daemon (sudo systemctl restart docker).
Настройка драйвера логирования для контейнера
Вы можете указать драйвер логирования для отдельного контейнера при его запуске с помощью флага --log-driver команды docker run. Дополнительные опции для драйвера можно передать с помощью флага --log-opt.
docker run --name my-container --log-driver syslog --log-opt syslog-address=192.168.1.20:514 my-image
docker run --name another-container --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 my-another-imageВ первом примере используется драйвер syslog с указанием адреса syslog-сервера. Во втором примере используется драйвер json-file с ограничением размера файла лога и количества ротируемых файлов.
Просмотр логов контейнера (docker logs)
Команда docker logs используется для просмотра логов контейнера, независимо от используемого драйвера логирования (Docker Daemon сам извлекает логи, используя настроенный драйвер).
docker logs <container_id_or_name>
docker logs -f <container_id_or_name> # Следить за логами в реальном времени (как tail -f)
docker logs --since "10m" <container_id_or_name> # Логи за последние 10 минут
docker logs --until "2023-10-27T10:00:00Z" <container_id_or_name> # Логи до указанного времени
docker logs --timestamps <container_id_or_name> # Добавить временные метки к логамУправление размером логов (json-file)
Для драйвера json-file важно настроить ротацию логов, чтобы предотвратить заполнение дискового пространства большими файлами логов. Это можно сделать с помощью опций --log-opt max-size (максимальный размер файла лога) и --log-opt max-file (максимальное количество ротируемых файлов).
Пример в docker run:
docker run --name my-web --log-driver json-file --log-opt max-size=20m --log-opt max-file=5 nginx:latestАналогично в docker-compose.yml:
version: "3.9"
services:
web:
image: nginx:latest
logging:
driver: "json-file"
options:
max-size: "20m"
max-file: "5"Лучшие практики логирования Docker
- Используйте структурированные логи: Форматируйте логи в структурированном формате (например, JSON), чтобы их было легче парсить и анализировать с помощью инструментов обработки логов. Многие библиотеки логирования приложений поддерживают структурированный вывод.
- Централизованное логирование: Настройте перенаправление логов в централизованную систему управления логами (например, Elasticsearch, Graylog, Splunk, CloudWatch Logs, Google Cloud Logging) для агрегации, поиска, анализа и хранения логов из всех ваших контейнеров и хостов.
- Использование таймзон UTC: Согласуйте использование часового пояса UTC для всех логов, чтобы избежать проблем с различиями во времени при анализе.
- Включение достаточной информации: Логи должны содержать достаточно информации для диагностики проблем (например, временные метки, уровень логирования, источник, сообщение).
- Управление размером логов: Настройте ротацию логов, чтобы предотвратить переполнение диска.
- Безопасность логов: Защитите доступ к файлам логов и централизованной системе логирования.
- Использование уровней логирования: Применяйте различные уровни логирования (например, DEBUG, INFO, WARNING, ERROR, CRITICAL) для контроля объема генерируемых логов в зависимости от среды (разработка, production).
- Correlation ID: В распределенных системах включайте Correlation ID в логи, чтобы отслеживать запросы через несколько сервисов.
- Health Checks: Используйте health checks Docker и оркестраторов для отслеживания состояния приложений, и логи могут помочь в диагностике причин сбоев health checks.
Правильно настроенное логирование является неотъемлемой частью эксплуатации контейнеризованных приложений. Оно обеспечивает видимость работы приложений, упрощает диагностику проблем и помогает в обеспечении стабильности и надежности системы. Выбор драйвера логирования и системы централизованного хранения и анализа логов зависит от ваших требований и инфраструктуры.