Перейти к содержимому
Главная страница » Как посмотреть логи Docker ?

Как посмотреть логи Docker ?

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

В этой статье рассматривается некоторая важная информация в этой области, чтобы было проще понять, как управлять файлами логов связанными с Docker, в вашей системе Linux.

Начнем изучение от простого к сложному с постепенным углублением в некоторые особенности.

Как просмотреть журналы Docker

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

Синтаксис прост:

docker logs container_name_or_ID

Вы, наверное, уже знаете, что можете использовать команду docker ps для просмотра имени и идентификатора запущенных контейнеров.

Давайте возьмем реальный пример. Я развернул Nextcloud с помощью Docker. Контейнер называется nextcloud, что неудивительно.

Теперь, чтобы просмотреть журналы контейнера с именем nextcloud, используйте:

docker logs nextcloud

Вот усеченная версия выходных данных приведенной выше команды:

172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] "HEAD /.env HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] "HEAD /c99.php HTTP/1.1" 302 1565 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] "HEAD /backup.tar HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] "HEAD /backup.zip HTTP/1.1" 302 1569 "-" "python-requests/2.26.0"
172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] "GET / HTTP/1.1" 302 1590 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"
172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] "GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1" 200 721 "-" "Nextcloud Server Crawler"
172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] "GET /login HTTP/1.1" 200 7501 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"

Слишком много данных? Хорошо то, что существуют различные опции, которые значительно упрощают просмотр журналов docker, точно так же, как журналы в Linux.

Откроем для просмотра только определенное количества строк

Команда Docker logs имеет --tail атрибут, который можно использовать аналогично команде tail.

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

Например, чтобы просмотреть последние 50 строк контейнера, вы можете использовать:

docker logs --tail 50 container_name_or_ID

Вы также можете использовать приведенную выше команду таким же образом

docker logs -n=50 container_name_or_ID

Просмотр журналов Docker в режиме реального времени в реальном контейнере

Вы можете полностью просматривать журналы контейнера в режиме реального времени. Чтобы “следить” за журналами, используйте атрибут --follow или -f.

docker logs -f container_name_or_ID

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

Для выхода вы можете просто использовать комбинацию клавиш Ctrl + C и вернуться к командной строке терминала.

Большинство параметров в docker logs подкоманде можно комбинировать для получения желаемого результата.

Например, docker logs -f заполнит экран всеми журналами с самого начала. Вы бы этого не хотели. Что вы можете сделать, так это объединить оба tail и follow подобные опции:

docker logs -f --tail 20 container_name_or_ID

Приведенная выше команда покажет последние 20 строк журналов, а затем будет следить за журналами в режиме реального времени.

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

Просмотреть временную метку в журналах Docker

Если вы также хотите просмотреть временные метки записей журнала, вы можете использовать опцию -t.

docker logs -t container_name_or_ID

Это можно легко комбинировать с другими опциями, такими как --follow и --tail.

Приведенная ниже команда покажет последние 10 строк файла журнала данного контейнера с временными метками, прикрепленными к каждой из них

docker logs -n=10 -t container_name_or_ID

Просмотр журналов Docker за указанный период времени

При расследовании проблемы время может быть критическим фактором, и в этом случае флаги --since и --until могут оказаться очень полезными.

Например, если вы исследуете проблему, возникшую за последние 24 часа, следующая команда покажет зарегистрированное содержимое всего, что произошло, только за это время:

docker logs --since 1440m -t container_name_or_ID

1440m в приведенной выше команде указано 24 × 60 минут. Добавление флага -t или --timestamps гарантирует, что строки отчетов будут помечены временной меткой, чтобы вам было еще проще анализировать инциденты или ошибки. Я бы предложил добавлять это при запросе любого контейнера.

Аналогично, если вам требуются сведения о журнале после первых 24 часов начала развертывания, эквивалентной командой будет:

docker logs --until 1440m -t nextcloud

Помимо указания времени в минутах, два вышеупомянутых флага также можно использовать с определенной временной меткой, которая -t генерируется. Формат like 2021-07-28T06:20:00.

docker logs --since 2021-07-28 -t container_name_or_ID

Приведенная выше команда покажет журналы с 28 июля 2021 года.Для получения полного обзора журналов docker вы также можете проверить его справочную страницу с помощью man docker-logs.

Доступ к журналам Docker из контейнера

В некоторых интересных вариантах использования вы можете захотеть использовать гибридный подход, при котором вы получаете доступ к журналам конкретного приложения из контейнеров.

Для этого вы входите в контейнер Docker:

docker exec -it container_name_or_ID sh

А затем вы можете использовать обычные инструменты Linux для получения журналов, связанных с приложениями. Одним из подходов было бы получить идентификатор процесса желаемой службы с помощью команды ps:

ps aux

Получите подробную информацию об этом процессе:

cat /proc/PID_of_process/fd/1

Журналы системных служб Docker

Если вы хотите просмотреть журналы самой службы Docker на хосте, вы можете использовать journalctl, если вы используете Ubuntu 16.04 или более позднюю версию:

sudo journalctl -u docker

Где хранятся журналы Docker?

Вы должны найти журналы docker в каталоге /var/lib/docker/containers в хост-системе. Этот каталог содержит файлы журналов, относящиеся ко всем контейнерам в их отдельных каталогах. Вы можете идентифицировать каталоги с помощью идентификатора контейнера.

Я использовал docker ps, чтобы найти, что 70f19fde9076 это идентификатор контейнера Nextcloud.

Если я загляну в каталог, где хранятся журналы docker:

avimanyu@localhost:~$ sudo ls -lh /var/lib/docker/containers

total 16K
drwx------ 4 root root 4.0K Jul 27 18:48 0efe12b28562c42619e533ad5f524d56740a7a3739d9e082c758bac95ae2a46f
drwx------ 4 root root 4.0K Jul 27 18:57 12c55f365f93ecb7f91e40bc130ddc2409216a61bbb244cd045a22b4513416d3
drwx------ 4 root root 4.0K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e
drwx------ 4 root root 4.0K Jul 27 18:57 a436399ef16a3efc0a909b9c3f725938e595e0b8fd34644b13f28b2c9bcb4ed7

В настоящее время запущено четыре контейнера, и вы можете видеть, что третий соответствует тому, который нам нужно изучить (он начинается с 70f19fde9076).

Если вы проверите содержимое этого каталога, вы увидите, что наш файл журнала находится прямо там!

avimanyu@localhost:~$ sudo ls -lh /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e

total 192K
-rw-r----- 1 root root 150K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log
drwx------ 2 root root 4.0K Jul 19 17:10 checkpoints
-rw------- 1 root root 5.5K Jul 27 18:58 config.v2.json
-rw-r--r-- 1 root root 1.5K Jul 27 18:58 hostconfig.json
-rw-r--r-- 1 root root   13 Jul 27 18:58 hostname
-rw-r--r-- 1 root root  198 Jul 27 18:58 hosts
drwx------ 3 root root 4.0K Jul 19 17:10 mounts
-rw-r--r-- 1 root root   79 Jul 27 18:58 resolv.conf
-rw-r--r-- 1 root root   71 Jul 27 18:58 resolv.conf.hash

Следовательно, соответствующий файл журнала — 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e.log который является тем же файлом, который вы читали, когда я запускал docker logs команду в начале.

Позвольте мне быстро убедиться в этом:

avimanyu@localhost:~$ sudo cat /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log

{"log":"172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] \"HEAD /.env HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:36:09.837857567Z"}
{"log":"172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] \"HEAD /c99.php HTTP/1.1\" 302 1565 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:49:52.996108799Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] \"HEAD /backup.tar HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:23.445225166Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] \"HEAD /backup.zip HTTP/1.1\" 302 1569 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:24.772881041Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] \"GET / HTTP/1.1\" 302 1590 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:03.678967877Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] \"GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1\" 200 721 \"-\" \"Nextcloud Server Crawler\"\n","stream":"stdout","time":"2021-07-25T20:36:07.404618408Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] \"GET /login HTTP/1.1\" 200 7501 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:07.619020402Z"}

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

Включение ротации журналов для Docker (JSON)

По умолчанию для ведения журнала на основе файла JSON ротация журналов в Docker отключена.

Это может вызвать проблему с дисковым пространством, если файлы журналов увеличиваются в размере. В нашем экземпляре Docker Ghost размер файлов журналов увеличился до 20 ГБ. Вы хотели бы избежать такой ситуации, включив ротацию журналов.

Чтобы включить ротацию журналов в Docker, отредактируйте /etc/docker/daemon.json файл:

sudo nano /etc/docker/daemon.json

Добавьте следующие строки и сохраните файл:

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

Перезапустите Docker daemon:

sudo systemctl restart docker

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *