Docker Logging
По умолчанию, в Docker для просмотра логов используется команда docker logs, которая выдает в консоль генерируемые контейнером логи. Какие именно логи, и в каком виде генерирует контейнер, зависит от того как запрграммирован endpoint-процесс контейнера. По умолчанию, в логи докера попадают STDOUT и STDERR главного процесса контейнера.
Команда docker logs не всегда выдает ожидаемую информацию:
- Если используется "драйвер логгирования", который логи в файл или другой лог-бэкенд, и
dual loggingотключен. - Если в контейнере работает не интерактивный процесс, такой как БД и веб-сервер, который настроен писать логи в отдельный файл вместо стандартных
STDOUTиSTDERR.
# Отображает все логи контейнера
docker logs <container_name>
# Отображает поток логов в реальном времени
docker logs -f <container_name>
Logging drivers
В Docker есть разные механизмы логгирования, которые помогают собирать информацию из запущенных контейнеров и сервисов. Этот механизм называется "драйвер логгирования". По умолчанию, все контейнеры используют default logging driver. Его можно переопределить, как для каждого контейнера в отдельности, так и для всего докер-хоста.
- Можно указывать драйвер при старте контейнера
- Можно изменить драйвер по умолчанию, для всех контейнеров.
После этого необходимо перезагрузить docker daemon
JSON File logging driver
По умолчанию, Докер весь вывод из STDOUT и STDERR всех контейнеров и записывает их в файлы использую JSON формат. Для каждого контейнера пишется отдельный лог-файл
{
"log": "Log line is here\n",
"stream": "stdout",
"time": "2019-01-01T11:11:11.111111111Z"
}
Для Docker Daemon можно изменить настроики json-драйвера логгирования в файле /etc/docker/daemon.json. Например, указать максимальный размер лог-файла и максимальное количество хранимых файлов, для ротации логов.
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Какие опции можно задать для json-file
Fluentd logging driver
Драйвер fluentd шлет структурированные логи из контейнеров на сборщик Fluentd, далее с помощью различных плагинов данные пересылаются дальше.
При использовании данного драйвера к сообщению лога добавляется дополнительная структурированная информация.
Для того, чтобы использовать драйвер fluentd для всех контейнеров по умолчанию, необходимо добавить следующие строки в /etc/docker/daemon.json
{
"log-driver": "fluentd",
"log-opts": {
"fluentd-address": "fluentdhost:24224"
}
}
Journald logging driver
Journald драйвер шлет логи из контейнеров в журнал systemd. После пересылки логов их можно просматривать как использую команды journalctl, так и docker logs.
В дополнении к информации которая поступает от логов контейнера, journald добавляет свой метаданные к каждому сообщению.
Для того, чтобы использовать драйвер journald для всех контейнеров по умолчанию, необходимо добавить следующие строки в /etc/docker/daemon.json
# Теперь логи контейнеров можно смотреть в системном журнале
sudo journalctl CONTAINER_NAME=webserver
Подробнее про драйвер journald
Loki driver
Официальный драйвер для Grafana Loki, собирает контейнерные логи и пересылает их в систему сбора и анализа логов Loki
Для того, чтобы данный драйвер был доступен для Докера, его необходимо установить в качестве Docker plugin
docker plugin install grafana/loki-docker-driver:3.3.2-amd64 --alias loki --grant-all-permissions
По умолчанию, при использовании драйвера loki логи пишутся паралельно в 2 места: на Loki-сервер и в json-file. По скольку размер файла, по умолчанию не ограничен, его следует ограничить вручную, с помощью ключей
--log-opt max-size=100m(ограничивает размер файла)--log-opt max-file=3(ограничивает количество лог-файлов), либо лог-файл можно отключить полностью:--log-opt no-file=true
- Для использования драйвера контейнером можно сконфигурировать отдельный контейнер, с помощью ключа
log-driver=lokiи ключа--log-opt <NAME>=<VALUE>
docker run --log-driver=loki \
--log-opt loki-url="http://localhost:3100/loki/api/v1/push" \
--log-opt loki-retries=5 \
--log-opt loki-batch-size=400 \
chentex/random-logger:latest 100 400 10
- Конфигурирование сервиса в Docer-compose для использования loki
version: "3"
services:
grafana:
image: grafana/grafana
logging:
driver: loki
options:
loki-url: http://localhost:3100/loki/api/v1/push
loki-pipeline-stages: |
- regex:
expression: '(level|lvl|severity)=(?P<level>\w+)'
- labels:
level:
ports:
- "3000:3000"
- Для того, чтобы использовать драйвер
lokiдля всех контейнеров по умолчанию, необходимо добавить следующие строки в/etc/docker/daemon.json
{
"log-driver": "loki",
"log-opts": {
"loki-url": "http://localhost:3100/loki/api/v1/push",
"loki-batch-size": "400",
"keep-file": "true",
"max-size": "50"
}
}
Очень важный момент! Все новые контейнеры будут слать логи в
loki. Все ранее созданные контейнеры будут отправлять логи в предыдущий драйвер. Чтобы изменить их поведение и перенаправить логи вloki, контейнеры нужно остановить, затем удалить, а затем создать по новой.
Опции log-opt для драйвера loki
| Опция | default | Расшифровка |
|---|---|---|
| loki-url | no | HTTP адрес Loki |
| loki-batch-size | 1048576 | Максимальный размер пакета логов для отправки. |
| no-file | false | Будут ли паралельно писаться лог-файлы на диск докер-хоста. |
| keep-file | false | Сохранять ли json-лог файл при перезапуске контейнера. По умолчанию - удалять. |
| max-size | -1 | Максимальный размер лог-файла. По умолчанию - не ограничен. |
| max-file | 1 | Максимальное количество лог-файлов. Применяется для ротации логов. |