Поиск строки в докерных журналах контейнера

Каков наилучший способ найти определенную строку в журналах контейнера Docker? Допустим, я хочу видеть все запросы, сделанные в образе докера "nginx", который пришел с ip, начинающегося с "127."

grep не будет работать должным образом в команде docker logs:

docker logs nginx | grep "127."

Он печатает все журналы, но не фильтрует результат!

Ответ 1

это может произойти, если контейнер записывается в stderr, трубопровод работает только для stdout, поэтому попробуйте:

docker logs nginx 2>&1 | grep "127."

Ответ 2

Чтобы следить за комментариями и разъяснять это, кто-то еще сталкивается с этой проблемой. Ниже приведен самый простой способ поиска журнала контейнеров nginx.

docker logs nginx > stdout.log 2>stderr.log
cat stdout.log | grep "127."

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

Ответ 3

Как фанат Vim я предпочитаю использовать less и искать с /

docker logs nginx 2>&1 | less

Ответ 4

Выполните следующую команду, чтобы извлечь имя контейнера для изображения nginx -

docker ps --filter ancestor=nginx

Скопируйте идентификатор контейнера из последней команды, а затем извлеките путь журнала для вашего контейнера с помощью команды ниже

grep "127." 'docker inspect --format={{.LogPath}} <ContainerName>'

Ответ 5

Сначала используйте эту команду (b1e3c456f07f - это идентификатор контейнера):

docker inspect --format='{{.LogPath}}' b1e3c456f07f

Результат будет примерно таким:

/var/lib/docker/containers/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767-json.log

Во-вторых, используйте эту команду (вы можете использовать vim, если хотите):

nano /var/lib/docker/containers/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767-json.log

Ответ 6

Кроме того, я нашел это полезным, чтобы выделить некоторые термины, которые я ищу в журналах. Особенно на продуктивных установках, где генерируется большое количество журналов. В моем случае я хочу выделить высказывания COUNT(*). Но с помощью простого grep я не вижу весь оператор SQL, поскольку он является многострочным. Это возможно с переключателем -E и некоторым регулярным выражением:

Например, следующий фрагмент поиска для всех запросов, которые содержат COUNT(*), а также count(*):

docker logs <containerName> -f | grep --line-buffered -i -E --color "select count\(\*\)|$"

Некоторое объяснение:

  • docker logs -f сообщает докеру f разрешить журналы, чтобы фильтр также применялся к новым записям, как при просмотре с помощью tail -f
  • Переключатель greps --line-buffered сбрасывает выходные данные в каждой строке, что необходимо для работы в режиме реального времени при использовании docker logs -f
  • -E - это e расширенный шаблон регулярных выражений, необходимый для применения нашего шаблона, который позволяет нам также возвращать несоответствующие результаты
  • --color выделяет совпадающие части (кажется, поведение по умолчанию на моем Ubuntu 16.04 LTS, но, возможно, не на других дистрибутивах, поэтому я включил его здесь, чтобы быть в безопасности)
  • * экранируется, чтобы отключить его специальную функциональность glob, где ( и ) маскируются, чтобы избежать их регулярного выражения в качестве группы, что активируется переключателем -E

Если контейнер записывает в stderr, вы можете передать их , как уже писал Эдоардо для простого grep:

docker logs <containerName> -f 2>&1 | grep --line-buffered -i -E --color "select count\(\*\)|$"

Переключатель -f может быть опущен, если не требуется живой grep. В обоих случаях вы видите весь журнал с выделенным поисковым термином, например:

enter image description here