Skip to content

Docker Logging

По умолчанию, в Docker для просмотра логов используется команда docker logs, которая выдает в консоль генерируемые контейнером логи. Какие именно логи, и в каком виде генерирует контейнер, зависит от того как запрграммирован endpoint-процесс контейнера. По умолчанию, в логи докера попадают STDOUT и STDERR главного процесса контейнера.

Команда docker logs не всегда выдает ожидаемую информацию:

  • Если используется "драйвер логгирования", который логи в файл или другой лог-бэкенд, и dual logging отключен.
  • Если в контейнере работает не интерактивный процесс, такой как БД и веб-сервер, который настроен писать логи в отдельный файл вместо стандартных STDOUT и STDERR.
docker logs
# Отображает все логи контейнера
docker logs <container_name>

# Отображает поток логов в реальном времени
docker logs -f <container_name>

Logging drivers

В Docker есть разные механизмы логгирования, которые помогают собирать информацию из запущенных контейнеров и сервисов. Этот механизм называется "драйвер логгирования". По умолчанию, все контейнеры используют default logging driver. Его можно переопределить, как для каждого контейнера в отдельности, так и для всего докер-хоста.

  • Можно указывать драйвер при старте контейнера
Задаем драйвер логгирования для единичного контейнера
docker run --log-driver=journald ...
  • Можно изменить драйвер по умолчанию, для всех контейнеров.
Меняем драйвер по умолчанию, для всех контейнеров
{
  "log-driver": "journald"
}

После этого необходимо перезагрузить docker daemon

docker restart
sudo systemctl restart docker

JSON File logging driver

По умолчанию, Докер весь вывод из STDOUT и STDERR всех контейнеров и записывает их в файлы использую JSON формат. Для каждого контейнера пишется отдельный лог-файл

Пример JSON лога
{
  "log": "Log line is here\n",
  "stream": "stdout",
  "time": "2019-01-01T11:11:11.111111111Z"
}

Для Docker Daemon можно изменить настроики json-драйвера логгирования в файле /etc/docker/daemon.json. Например, указать максимальный размер лог-файла и максимальное количество хранимых файлов, для ротации логов.

daemon.json json-file
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

Какие опции можно задать для json-file

Fluentd logging driver

Драйвер fluentd шлет структурированные логи из контейнеров на сборщик Fluentd, далее с помощью различных плагинов данные пересылаются дальше.

При использовании данного драйвера к сообщению лога добавляется дополнительная структурированная информация.

Для того, чтобы использовать драйвер fluentd для всех контейнеров по умолчанию, необходимо добавить следующие строки в /etc/docker/daemon.json

daemon.json fluentd
{
  "log-driver": "fluentd",
  "log-opts": {
    "fluentd-address": "fluentdhost:24224"
  }
}

Подробнее про драйвер fluentd

Journald logging driver

Journald драйвер шлет логи из контейнеров в журнал systemd. После пересылки логов их можно просматривать как использую команды journalctl, так и docker logs.

В дополнении к информации которая поступает от логов контейнера, journald добавляет свой метаданные к каждому сообщению.

Для того, чтобы использовать драйвер journald для всех контейнеров по умолчанию, необходимо добавить следующие строки в /etc/docker/daemon.json

daemon.json fluentd
{
  "log-driver": "journald"
}
journalctl CONTAINER_NAME=
# Теперь логи контейнеров можно смотреть в системном журнале
sudo journalctl CONTAINER_NAME=webserver

Подробнее про драйвер journald

Loki driver

Официальный драйвер для Grafana Loki, собирает контейнерные логи и пересылает их в систему сбора и анализа логов Loki

Для того, чтобы данный драйвер был доступен для Докера, его необходимо установить в качестве Docker plugin

Install grafana/loki-docker-driver
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>
Запуск контейнера с драйвером loki
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
daemon.json loki
{
  "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 Максимальное количество лог-файлов. Применяется для ротации логов.

Поддерживаемые log-opt опции для драйвера loki

Подробно про Loki driver