Обзор
Файлы журналов, созданные контейнерами 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 . Кроме того, мы запускаем эту команду в фоновом режиме с помощью & , поэтому она будет работать до тех пор, пока не будет явно остановлена.