Перейти к содержимому

Как посмотреть логи контейнера docker

  • автор:

Просмотр docker logs

Для просмотра логов из контейнера используется удобная и понятная команда docker logs.

Что еще удобного есть в команде docker logs?

  1. —follow — просматривать логи в режиме реального времени (-f)
  2. —details — выводить дополнительную информацию в логах
  3. —tail n — выводить последние n логов. Удобно если контейнер пишет очень много логов, а нам интересна лишь ее последняя часть.
  4. —since и —until — показывать логи в определенном интервале, заданным timestamp (2018-11-014T21:23:37) или вида 1m, 30m и так далее.
  5. —timestamps или -t — показывать время логов.

Leave a Comment Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Docker — Просмотр логов всех контейнеров

Для просмотра логов контейнера обычно используется встроенная команда docker logs , но есть правда пару минусов, которые конечно решаемые, но не хочется тратить своё время на костыли. Вот несколько из этих минусов:

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

gliderlabs/logspout

Для самого простого решения этих проблем мы можем использовать контейнер gliderlabs/logspout, который подключится к сокету docker и будет выводить абсолютно все логи в одном месте, что кстати очень полезно для debug.

Для запуска выполняем команду:

docker run -d --name="logspout" --volume=/var/run/docker.sock:/var/run/docker.sock --publish=127.0.0.1:8000:80 gliderlabs/logspout 

Для просмотра логов используем curl:

curl http://127.0.0.1:8000/logs 

Работаем с логами контейнеров Docker

Перевод: Reviewing Docker Logs

Docker

Многие знают, что есть команда docker logs. Чуть меньшее количество людей знает, что этот функционал можно расширить для отслеживания новых сообщений в контейнере (примерно как работает tail -f на обычных файлах), и уж совсем немногие знают и помнят, что можно указывать временные метки для просмотра логов контейнера только с определённого промежутка времени.

Show Docker Container Logs

Самая простая команда для просмотра логов контейнера:

# docker logs mycontainer1

Так можно посмотреть все доступные логи контейнера mycontainer1, самые свежие сообещния будут в конце.

Отслеживание новых сообщений в логах Docker

Чтобы следить за появлением новых сообщений в контейнере, нужно указать опцию -f (от английского follow — следовать):

# docker logs -f mycontainer1

Сначала результат команды будет такой же, как и в предыдущем примере. Но во-первых, команда не завершится и вы не получите приглашения командной строки (это будет ждущий режим). А во-вторых, скоро должны появиться новые логи из контейнера.

Просмотр логов в промежутке времени

А вот это по-настоящему полезная весч. Можно получить только те сообщения в логах, которые произошли между указанными точками времени.

Для доступа к логам определённого рвемени, используйте параметры –since (от даты) и –until (до даты) для команды docker logs.

ЗАМЕЧУ: можно и не даты указвыать, а даты и время — но для моих нужд и дат хватает.

Вот пример просмотра логов контейнера для Java приложения. Как видите, благодаря моим параметрам мы получили только сообщения между 30м марта и 1м апреля:

root@s2:~ # docker logs -f confluence --since 2020-03-30 --until 2020-04-01 30-Mar-2020 07:52:27.292 INFO [http-nio-8090-exec-7] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:415) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:292) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) 30-Mar-2020 09:22:28.099 INFO [http-nio-8090-exec-1] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:415) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:292) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) 30-Mar-2020 23:57:24.900 INFO [http-nio-8090-exec-3] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:415) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:292) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)

That’s it for today, have fun with Docker!

Ссылки

  • Docker
  • Модуль Docker в Ansible
  • Руководство по Docker

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

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

  • Вопрос задан более трёх лет назад
  • 41442 просмотра

Комментировать
Решения вопроса 0
Ответы на вопрос 2
Site Reliability Engineer

AWS не пересобирает образ, AWS рестартует контейнер если тот завершился.
Ваш контейнер скорее всего писал логи в stdout.
Зайдите на инстанс по SSH, затем сделайте docker ps -a , там можно будет увидеть только что завершенный контейнер. Раньше AWS их оставлял, но сейчас, в связи с обновлением ECS-агента, судя по всему, он их подчищает, поэтому свой контейнер вы можете не увидеть.
Если же старый контейнер еще остался то все равно можно посмотреть его логи – docker logs

Тем не менее, желательно прикрутить внешний сервис логирования, например LogEntries, Papertrail или другие подобные системы.

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

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