在Docker容器的日志中找到特定字符串的最佳方法是什么?假设我想查看所有在“ nginx”泊坞窗映像中发出的请求,这些请求来自以“ 127”开头的IP。
grep无法在docker logs命令上按预期工作:
docker logs nginx | grep "127."
它打印所有日志,但不过滤结果!
在Docker容器的日志中找到特定字符串的最佳方法是什么?假设我想查看所有在“ nginx”泊坞窗映像中发出的请求,这些请求来自以“ 127”开头的IP。
grep无法在docker logs命令上按预期工作:
docker logs nginx | grep "127."
它打印所有日志,但不过滤结果!
docker logs
将输出发送到标准输出?因为如果这样做的话,grep
应该就可以了。如果不是,那就有点破烂了,在使用进行过滤之前,您需要将标准错误重定向到标准输出grep
。
$ 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
docker logs
由于它包含终端控制字符,因此看起来很难理解。我会通过nginx日志文件grep。
Answers:
跟踪评论并为遇到此问题的其他人澄清这一点。这是我看到的搜索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
此外,我发现在日志中突出显示正在搜索的某些术语很有用。特别是在生产大量日志输出的生产性安装中。就我而言,我想突出COUNT(*)
声明。但是使用简单的grep,因为它是多行语句,所以看不到整个SQL语句。这可以通过-E
switch和一些正则表达式来实现:
例如,以下代码段搜索包含COUNT(*)
和的所有查询 count(*)
:
docker logs <containerName> -f | grep --line-buffered -i -E --color "select count\(\*\)|$"
一些解释:
docker logs -f
告诉搬运工到˚F ollow日志,所以过滤器还applys新entrys使用观看时它像tail -f
--line-buffered
开关刷新每行的输出,docker logs -f
使用时实时grep要求-E
是一种ê申请我们的模式,让我们也返回非匹配结果xtended正则表达式模式,需要--color
突出显示匹配的部分(似乎在我的Ubuntu 16.04 LTS上是默认行为,但也许在其他发行版中没有,所以为了安全起见,在此处包括了默认行为)*
进行转义以禁用其特殊的glob功能,其中(
和)
被屏蔽以避免其正则表达式作为组,这由-E
switch启用如果容器记录到stderr,则可以像Edoardo已经为简单的grep编写的那样通过管道传递它们:
docker logs <containerName> -f 2>&1 | grep --line-buffered -i -E --color "select count\(\*\)|$"
-f
如果不需要实时grep,则可以省略该开关。在这两种情况下,您都可以看到整个日志栏,其中都带有如下突出显示的搜索词:
运行以下命令以提取图像nginx的容器名称-
docker ps --filter ancestor=nginx
从上一个命令复制容器ID,然后通过以下命令提取容器的日志路径
grep "127." `docker inspect --format={{.LogPath}} <ContainerName>`
首先,使用以下命令(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
-f
在调试问题时,通常也将它与option一起使用
docker logs -f nginx 2>&1 | grep "127."
它将向我们实时显示我们的期望。