Настройка драйверов ведения журналов

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

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

Примечание

Совет: используйте «локальный» драйвер ведения журнала, чтобы предотвратить исчерпание дискового пространства

По умолчанию ротация журналов не выполняется. В результате файлы журналов, хранящиеся драйвером ведения журналов по умолчанию драйвер регистрации json-файлов, могут привести к тому, что значительный объём дискового пространства будет использоваться для контейнеров, которые генерируют много выходных данных, что может привести к исчерпанию дискового пространства.

Docker сохраняет драйвер ведения журналов json-файлов (без ротации журналов) по умолчанию, чтобы сохраняет обратную совместимость со старыми версиями Docker и в ситуациях, когда Docker используется в качестве среды выполнения для Kubernetes.

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

Настройка драйвера ведения журнала по умолчанию

Чтобы настроить демон Docker по умолчанию для определённого драйвера ведения журнала, устанавливает значение log-driver на имя драйвера ведения журнала в файле конфигурации daemon.json. Обратитесь к разделу «файл конфигурации демона» в справочное руководство по докерду для получения подробной информации.

Драйвер ведения журнала по умолчанию — json-file. В следующем примере в качестве драйвера ведения журнала по умолчанию задается local драйвер журнала:

{
  "log-driver": "local"
}

Если драйвер ведения журнала имеет настраиваемые параметры, вы можете установить их в файле daemon.json как объект JSON с ключом log-opts. В следующем примере задаются четыре настраиваемых параметра драйвера ведения журнала json-file:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "labels": "production_status",
    "env": "os,customer"
  }
}

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

Примечание

Параметры конфигурации log-opts в файле конфигурации daemon.json должны быть указаны в виде строк. Поэтому логические и числовые значения (например, значение для max-file в приведённом выше примере) должны быть заключены в кавычки (").

Если вы не укажете драйвер ведения журнала, по умолчанию используется json-file. Чтобы найти текущий драйвер ведения журнала по умолчанию для демона Docker, запускает docker info и найти Logging Driver. Вы можете использовать следующую команду в Linux, macOS или PowerShell в Windows:

$ docker info --format '{{.LoggingDriver}}'

json-file

Примечание

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

Настройка драйвера ведения журнала для контейнера

Когда вы запускаете контейнер, вы можете настроить его на использование другого драйвера ведения журнала, отличного от используемого по умолчанию демона Docker, используя флаг --log-driver. Если драйвер ведения журнала имеет настраиваемые параметры, вы можете установить их с помощью одного или нескольких экземпляров флага --log-opt <NAME>=<VALUE>. Даже если контейнер использует драйвер ведения журнала по умолчанию, он может использовать другие настраиваемые параметры.

В следующем примере контейнер Alpine запускается с драйвером ведения журнала none.

$ docker run -it --log-driver none alpine ash

Чтобы найти текущий драйвер ведения журнала для работающего контейнера, если демон использует драйвер ведения журнала json-file, выполняет следующую команду docker inspect, заменив имя или идентификатор контейнера на <CONTAINER>:

$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>

json-file

Настраивает режим доставки сообщений журнала из контейнера в драйвер журнала

Docker предоставляет два режима доставки сообщений из контейнера в драйвер журнала:

  • (по умолчанию) прямая, блокирующая доставку от контейнера к драйверу

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

Режим доставки сообщений non-blocking предотвращает блокировку приложений из-за обратного давления в журнале. Приложения могут неожиданно завершиться с ошибкой, если потоки STDERR или STDOUT блокируются.

Предупреждение

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

Параметр журнала mode определяет, следует ли использовать доставку сообщений blocking (по умолчанию) или non-blocking.

Параметр журнала max-buffer-size управляет размером кольцевого буфера, используемого для промежуточного хранения сообщений, когда для параметра mode установлено значение non-blocking. max-buffer-size по умолчанию равен 1 мегабайту.

В следующем примере контейнер Alpine запускается с выводом журнала в неблокирующем режиме и с 4-мегабайтным буфером:

$ docker run -it --log-opt mode=non-blocking --log-opt max-buffer-size=4m alpine ping 127.0.0.1

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

Некоторые драйверы ведения журналов добавляют значение флагов контейнера --env|-e или --label в журналы контейнера. В этом примере контейнер запускается с использованием драйвера ведения журнала демона Docker по умолчанию (допустим, json-file), но устанавливается переменная среды os=ubuntu.

$ docker run -dit --label production_status=testing -e os=ubuntu alpine sh

Если драйвер ведения журнала поддерживает это, это добавляет дополнительные поля к выходным данным ведения журнала. Следующий вывод генерируется драйвером ведения журнала json-file:

"attrs":{"production_status":"testing","os":"ubuntu"}

Поддерживаемые драйверы ведения журнала

Поддерживаются следующие драйверы ведения журнала. См. ссылку на документацию каждого драйвера для его настраиваемых параметров, если это применимо. Если вы используете плагины драйверов протоколирования, вы можете увидеть больше вариантов.

Драйвер

Описание

none

Журналы для контейнера недоступны, и docker logs не возвращает никаких выходных данных.

локальный

Журналы хранятся в пользовательском формате, предназначенном для минимальных накладных расходов.

json-файл

Журналы имеют формат JSON. Драйвер ведения журнала по умолчанию для Docker.

системный журнал

Записывает сообщения журнала в средство syslog. Демон syslog должен быть запущен на хост-компьютере.

journald

Записывает сообщения журнала в journald. Демон journald должен быть запущен на хост-компьютере.

gelf

Записывает сообщения журнала в конечную точку расширенного формата журнала Graylog (GELF), например Graylog или Logstash.

fluentd

Записывает сообщения журнала в fluentd (прямой ввод). Демон fluentd должен быть запущен на хост-компьютере.

awslogs

Записывает сообщения журнала в журналы Amazon CloudWatch.

splunk

Записывает сообщения журнала в splunk с помощью сборщика событий HTTP.

etwlogs

Записывает сообщения журнала как события трассировки событий для Windows (ETW). Доступно только на платформах Windows.

gcplogs

Записывает сообщения журнала в журнал Google Cloud Platform (GCP).

логи

Записывает сообщения журнала в Rapid7 Logentries.

Примечание

При использовании Docker Engine 19.03 или более ранней версии docker logs команда работает только для драйверов ведения журнала local, json-file и journald. В Docker 20.10 и более поздних версиях представлено «двойное журналирование», в котором используется локальный буфер, позволяющий использовать команду docker logs для любого драйвера ведения журнала. Обратитесь к чтение журналов при использовании драйверов удаленного ведения журнала за подробностями.

Ограничения логирования драйверов

  • Чтение информации журнала требует распаковки повернутых файлов журнала, что вызывает временное увеличение использования диска (до тех пор, пока записи журнала из повернутых файлов не будут прочитаны) и повышенную загрузку ЦП при распаковке.

  • Ёмкость хранилища хоста, в котором находится каталог данных Docker, определяет максимальный размер информации файла журнала.