在容器的Docker日志中查找字符串


72

在Docker容器的日志中找到特定字符串的最佳方法是什么?假设我想查看所有在“ nginx”泊坞窗映像中发出的请求,这些请求来自以“ 127”开头的IP。

grep无法在docker logs命令上按预期工作:

docker logs nginx | grep "127."

它打印所有日志,但不过滤结果!


问题是:在Docker容器的日志中找到特定字符串的最佳方法是什么?
Gering 2016年

是否docker logs将输出发送到标准输出?因为如果这样做的话,grep应该就可以了。如果不是,那就有点破烂了,在使用进行过滤之前,您需要将标准错误重定向到标准输出grep
Etan Reisner

1
检查stderr et atdout,从github.com/docker/docker/issues/7440中 提取$ docker run -d --name foo busybox ls abcd $ docker logs foo > stdout.log 2>stderr.log $ cat stdout.log $ cat stderr.log ls: abcd: No such file or directory
user2915097

1
@Robse对不起,在添加该示例之前,您的问题很难得到。docker logs由于它包含终端控制字符,因此看起来很难理解。我会通过nginx日志文件grep。
hek2mgl 2016年

想知道您是否可以使用--follow来执行此操作,以便在容器初始化时grep保持循环
Mr-Programs

Answers:


147

如果容器正在记录到stderr,则这种情况可能会发生,管道仅对stdout有效,因此请尝试:

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

9

作为vim爱好者,我更喜欢使用less和搜索/

docker logs nginx 2>&1 | less

4

跟踪评论并为遇到此问题的其他人澄清这一点。这是我看到的搜索Nginx容器日志的最简单方法。

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

IMO有点混乱,因为您需要创建和删除这些可能非常大的文件。希望我们会得到一些工具,使其更加方便。


不太可能-它似乎不docker logs支持单独的stdout和stderr github.com/moby/moby/issues/25683
MartynasJusevičius19年


3

此外,我发现在日志中突出显示正在搜索的某些术语很有用。特别是在生产大量日志输出的生产性安装中。就我而言,我想突出COUNT(*)声明。但是使用简单的grep,因为它是多行语句,所以看不到整个SQL语句。这可以通过-Eswitch和一些正则表达式来实现

例如,以下代码段搜索包含COUNT(*)和的所有查询 count(*)

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

一些解释:

  • docker logs -f告诉搬运工到˚F ollow日志,所以过滤器还applys新entrys使用观看时它像tail -f
  • greps--line-buffered开关刷新每行的输出,docker logs -f使用时实时grep要求
  • -E是一种ê申请我们的模式,让我们也返回非匹配结果xtended正则表达式模式,需要
  • --color 突出显示匹配的部分(似乎在我的Ubuntu 16.04 LTS上是默认行为,但也许在其他发行版中没有,所以为了安全起见,在此处包括了默认行为)
  • *进行转义以禁用其特殊的glob功能,其中()被屏蔽以避免其正则表达式作为组,这由-Eswitch启用

如果容器记录到stderr,则可以像Edoardo已经为简单的grep编写的那样通过管道传递它们:

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

-f如果不需要实时grep,则可以省略该开关。在这两种情况下,您都可以看到整个日志栏,其中都带有如下突出显示的搜索词:

在此处输入图片说明


2

运行以下命令以提取图像nginx的容器名称-

docker ps --filter ancestor=nginx

从上一个命令复制容器ID,然后通过以下命令提取容器的日志路径

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

0

首先,使用以下命令(b1e3c456f07f是容器id):

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

结果将是这样的:

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

其次,使用以下命令(如果愿意,可以使用vim):

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.