Используйте журналы Docker с драйверами удаленного ведения журнала

Обзор

До Docker Engine 20.10 docker logs command можно было использовать только с драйверами ведения журнала, которые поддерживали контейнеры с использованием драйверов журнала local, json-file или journald. Однако многие сторонние драйверы ведения журналов не поддерживали локальное чтение журналов с использованием docker logs

Это создало множество проблем при попытке собрать данные журнала автоматическим и стандартным способом. Доступ к информации журнала и её просмотр можно было получает только через стороннее решение в формате, указанном этим сторонним инструментом.

Начиная с Docker Engine 20.10, вы можете использовать docker logs для чтения журналов контейнера независимо от настроенного драйвера ведения журнала или подключаемого модуля. Эта возможность, называемая «двойным ведением журнала», позволяет использовать docker logs для локального чтения журналов контейнера в согласованном формате, независимо от используемого драйвера журнала, поскольку ядро настроено на запись информации в «локальный» драйвер ведения журнала. См. Настройка драйвера протоколирования по умолчанию для получения дополнительной информации.

Двойное журналирование использует драйвер ведения журнала local в качестве кэша для чтения последних журналов ваших контейнеров. По умолчанию в кеше включена ротация файлов журнала, и он ограничен максимум 5 файлами по 20 МБ каждый (до сжатия) на контейнер.

Обратитесь к разделу параметры конфигурации, чтобы настроить данные значения по умолчанию, или к разделу отключенное журналирование, чтобы отключить эту функцию.

Предпосылки

Для использования двойного ведения журнала не требуется никаких изменений конфигурации. Docker Engine 20.10 и более поздние версии автоматически включают двойное журналирование, если настроенный драйвер ведения журнала не поддерживает чтение журналов.

В следующих примерах показан результат выполнения команды docker logs с возможностью двойного ведения журнала и без нее:

Без возможности двойного ведения журнала

Если для контейнера настроен драйвер удаленного ведения журнала, например splunk, и двойное журналирование отключено, при попытке чтения журналов контейнера локально отображается ошибка:

  • Шаг 1. Настраивает демон Docker

    $ cat /etc/docker/daemon.json
    {
      "log-driver": "splunk",
      "log-opts": {
        "cache-disabled": "true",
        ... (options for "splunk" logging driver)
      }
    }
    
  • Шаг 2: Запуск контейнера

    $ docker run -d busybox --name testlog top
    
  • Шаг3. Чтение журналов контейнера

    $ docker logs 7d6ac83a89a0
    Error response from daemon: configured logging driver does not support reading
    

С возможностью двойного ведения журнала

При включенном двойном кэше журналов команду docker logs можно использовать для чтения журналов, даже если драйвер ведения журналов не поддерживает чтение журналов. В следующих примерах показана конфигурация демона, которая по умолчанию использует драйвер удаленного ведения журнала splunk с включенным кэшированием двойного ведения журнала:

  • Шаг 1. Настраивает демон Docker

    $ cat /etc/docker/daemon.json
    {
      "log-driver": "splunk",
      "log-opts": {
        ... (options for "splunk" logging driver)
      }
    }
    
  • Шаг 2: Запуск контейнера

    $ docker run -d busybox --name testlog top
    
  • Шаг3. Чтение журналов контейнера

    $ docker logs 7d6ac83a89a0
    2019-02-04T19:48:15.423Z [INFO]  core: marked as sealed
    2019-02-04T19:48:15.423Z [INFO]  core: pre-seal teardown starting
    2019-02-04T19:48:15.423Z [INFO]  core: stopping cluster listeners
    2019-02-04T19:48:15.423Z [INFO]  core: shutting down forwarding rpc listeners
    2019-02-04T19:48:15.423Z [INFO]  core: forwarding rpc listeners stopped
    2019-02-04T19:48:15.599Z [INFO]  core: rpc listeners successfully shut down
    2019-02-04T19:48:15.599Z [INFO]  core: cluster listeners successfully shut down
    

Примечание

Для драйверов ведения журнала, которые поддерживают чтение журналов, таких как драйверы local, json-file и journald, нет никакой разницы в функциональности до или после того, как стала доступна возможность двойного ведения журнала. Для данных драйверов журналы можно читает с помощью docker logs в обоих сценариях.

Варианты конфигурации

Кэш «двойного ведения журнала» принимает те же параметры конфигурации, что и локальный драйвер регистрации, но с префиксом cache-. Данные параметры можно указывает для каждого контейнера, а значения по умолчанию для новых контейнеров можно установить с помощью параметра файл конфигурации демона.

По умолчанию в кеше включена ротация файлов журнала, и он ограничен максимум 5 файлами по 20 МБ каждый (до сжатия) на контейнер. Используйте параметры конфигурации, рассмотренные далее, чтобы настроить данные значения по умолчанию.

Опция

По умолчанию

Описание

cache-disabled

"false"

Отключить локальное кэширование. Логическое значение передаётся в виде строки (true, 1, 0, или false).

cache-max-size

"20m"

Максимальный размер кэша до его ротации. Положительное целое число плюс модификатор, представляющий единицу измерения (k, m или g).

cache-max-file

"5"

Максимальное количество файлов кэша, которые могут присутствовать. Если ротация журналов создаёт лишние файлы, самый старый файл удаляется. Положительное целое число.

cache-compress

"true"

Включает или отключает сжатие ротированных файлов журналов. Логическое значение передаётся в виде строки (true, 1, 0 или false).

Отключить кеш двойного журнала

Используйте параметр cache-disabled, чтобы отключить двойной кэш журналов. Отключение кеша может быть полезно для экономии места в хранилище в ситуациях, когда журналы считываются только через удаленную систему ведения журналов и если нет необходимости читать журналы через docker logs в целях отладки.

Кэширование может быть отключено для отдельных контейнеров или по умолчанию для новых контейнеров при использовании файл конфигурации демона.

В следующем примере файл конфигурации демона используется для использования драйвера ведения журналов «splunk» по умолчанию с отключенным кэшированием:

$ cat /etc/docker/daemon.json
{
  "log-driver": "splunk",
  "log-opts": {
    "cache-disabled": "true",
    ... (options for "splunk" logging driver)
  }
}

Примечание

Для драйверов ведения журнала, поддерживающих чтение журналов, таких как драйверы local, json-file и journald, двойное журналирование не используется, и отключение этого параметра не имеет никакого эффекта.

Ограничения

  • Если у контейнера, использующего драйвер ведения журналов или подключаемый модуль, который удаленно отправляет журналы, внезапно вызывается «сетевая» проблема, «запись» в локальный кеш не происходит.

  • Если запись в logdriver завершается неудачно по какой-либо причине (файловая система заполнена, права на запись удалены), запись в кэш завершается ошибкой и регистрируется в журнале демона. Запись журнала в кэш не повторяется.

  • Некоторые журналы могут быть потеряны из кеша в конфигурации по умолчанию, поскольку кольцевой буфер используется для предотвращения блокировки stdio контейнера в случае медленной записи файлов. Администратор должен восстановить их, пока демон выключен.