Ответ 1
это может произойти, если контейнер записывается в stderr, трубопровод работает только для stdout, поэтому попробуйте:
docker logs nginx 2>&1 | grep "127."
Каков наилучший способ найти определенную строку в журналах контейнера Docker? Допустим, я хочу видеть все запросы, сделанные в образе докера "nginx", который пришел с ip, начинающегося с "127."
grep не будет работать должным образом в команде docker logs:
docker logs nginx | grep "127."
Он печатает все журналы, но не фильтрует результат!
это может произойти, если контейнер записывается в stderr, трубопровод работает только для stdout, поэтому попробуйте:
docker logs nginx 2>&1 | grep "127."
Чтобы следить за комментариями и разъяснять это, кто-то еще сталкивается с этой проблемой. Ниже приведен самый простой способ поиска журнала контейнеров nginx.
docker logs nginx > stdout.log 2>stderr.log
cat stdout.log | grep "127."
IMO - своего рода беспорядочный, потому что вам нужно создавать и удалять эти потенциально очень большие файлы. Надеюсь, мы получим несколько инструментов, чтобы сделать их более удобными.
Как фанат Vim я предпочитаю использовать less
и искать с /
docker logs nginx 2>&1 | less
Выполните следующую команду, чтобы извлечь имя контейнера для изображения nginx -
docker ps --filter ancestor=nginx
Скопируйте идентификатор контейнера из последней команды, а затем извлеките путь журнала для вашего контейнера с помощью команды ниже
grep "127." 'docker inspect --format={{.LogPath}} <ContainerName>'
Сначала используйте эту команду (b1e3c456f07f - это идентификатор контейнера):
docker inspect --format='{{.LogPath}}' b1e3c456f07f
Результат будет примерно таким:
/var/lib/docker/containers/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767-json.log
Во-вторых, используйте эту команду (вы можете использовать vim, если хотите):
nano /var/lib/docker/containers/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767/b1e3c456f07f2cb3ae79381ada33a034041a10f65174f52bc1792110b36fb767-json.log
Кроме того, я нашел это полезным, чтобы выделить некоторые термины, которые я ищу в журналах. Особенно на продуктивных установках, где генерируется большое количество журналов. В моем случае я хочу выделить высказывания COUNT(*)
. Но с помощью простого grep я не вижу весь оператор SQL, поскольку он является многострочным. Это возможно с переключателем -E
и некоторым регулярным выражением:
Например, следующий фрагмент поиска для всех запросов, которые содержат COUNT(*)
, а также count(*)
:
docker logs <containerName> -f | grep --line-buffered -i -E --color "select count\(\*\)|$"
Некоторое объяснение:
docker logs -f
сообщает докеру f разрешить журналы, чтобы фильтр также применялся к новым записям, как при просмотре с помощью tail -f
--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. В обоих случаях вы видите весь журнал с выделенным поисковым термином, например: