Руководство по журналам Docker

Автор: | 01/09/2023

Обзор

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

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

В зависимости от версии ПО Docker некоторые параметры команды могут не работать!

Понимание журналов Docker

В Docker есть два типа файлов журналов:
— Журналы демона Docker дают представление об общем состоянии службы Docker.
— Журналы контейнера Docker охватывают все журналы, относящиеся к конкретному контейнеру.

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

Использование  команды docker logs

docker logs bce34bb3c617
# Извлекает журналы, существующие на момент выполнения контейнера

docker logs --details bce34bb3c617
# Добавляет дополнительные атрибуты, такие как переменные среды и метки, предоставленные --log-opt при создании контейнера.

docker logs --follow  bce34bb3c617
# Следить за выводом журнала лога контейнера в режиме реального времени

docker logs --tail bce34bb3c617
# Количество строк, отображаемых с конца журналов

docker logs --follow --tail 1 bce34bb3c617
# Просмотреть последнюю запись лога контейнера в режиме реального времени

docker logs --since 2022-05-16  bce34bb3c617
# Просмотра файла лога за определенное время
docker logs -f --until=2s test
Tue 14 Nov 2017 16:40:00 CET
Tue 14 Nov 2017 16:40:01 CET
Tue 14 Nov 2017 16:40:02 CET

https://docs.docker.com/engine/reference/commandline/logs/

Использование файла журнала по умолчанию

Docker хранит все выходные данные STDOUT и STDERR в формате JSON. Кроме того, можно отслеживать все текущие журналы Docker с хост-компьютера. По умолчанию Docker хранит файлы журналов в выделенном каталоге на хосте с помощью драйвера журнала json-file . Каталог файла журнала — /var/lib/docker/containers/<container_id> на хосте, на котором работает контейнер.

Для демонстрации давайте проверим файл журнала нашего контейнера postgress-baeldung  :

$ cat /var/lib/docker/containers/bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a/
  bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a-json.log 
{"log":"\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833312658Z"}
{"log":"PostgreSQL Database directory appears to contain a database; Skipping initialization\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833360038Z"}
{"log":"\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833368499Z"}

В приведенном выше выводе мы видим, что данные представлены в формате JSON.

Очистка файла журнала

Иногда нам не хватает места на диске в нашей системе, и мы замечаем, что файлы журналов Docker занимают много места. Для этого нам сначала нужно найти файлы журналов, а затем удалить их. Также убедитесь, что очистка файла журнала не влияет на состояние работающего контейнера.

Ниже приведена команда для очистки всех файлов журналов, хранящихся на хост-компьютере:

$ truncate -s 0 /var/lib/docker/containers/*/*-json.log 

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

$ truncate -s 0 /var/lib/docker/containers/dd207f11ebf083f97355be1ae18420427dd2e80b061a7bf6fb0afc326ad04b10/*-json.log 

В начале контейнера мы также можем ограничить размер файла журнала извне, используя параметры -log-opt max-size и -log-opt max-file команды запуска docker :

$ docker run --log-opt max-size=1k --log-opt max-file=5 -itd -e POSTGRES_USER=baeldung -e POSTGRES_PASSWORD=baeldung -p 5432:5432
  -v /data:/var/lib/postgresql/data --name postgresql-baedlung postgres
3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32

Мы также можем предоставить конфигурацию максимального размера журнала и максимального файла в файле /etc/docker/daemon.json . Давайте посмотрим на конфигурацию файла daemon.json:

{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "1k",
        "max-file": "5" 
    }
}

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

Перенаправление журналов контейнера Docker в один файл

По умолчанию файлы журналов контейнеров Docker хранятся в каталоге /var/lib/docker/containers/<containerId> . Кроме того, мы также можем перенаправить логи контейнеров Docker в какой-либо другой файл.

Для иллюстрации давайте рассмотрим команду перенаправления журнала контейнера:

$ docker logs -f containername &> baeldung-postgress.log &

Здесь в приведенной выше команде мы перенаправляем все текущие журналы в файл baeldung-postgress.log . Кроме того, мы запускаем эту команду в фоновом режиме с помощью & , поэтому она будет работать до тех пор, пока не будет явно остановлена.

https://www.baeldung.com/ops/docker-logs