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

Ger*_*ing 52 grep docker

在docker容器的日志中查找特定字符串的最佳方法是什么.假设我想查看所有请求,这些请求是在"nginx"docker镜像中创建的,该镜像来自以"127"开头的ip.

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

docker logs nginx | grep "127."
Run Code Online (Sandbox Code Playgroud)

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

Edo*_*rdo 102

如果容器正在登录到stderr,管道仅适用于stdout,则会发生这种情况,请尝试:

docker logs nginx 2>&1 | grep "127."
Run Code Online (Sandbox Code Playgroud)


Ali*_*Ali 14

你可以使用这些:

  1. 在所有外壳上:
    docker logs nginx 2>&1 | grep "127."
    
    Run Code Online (Sandbox Code Playgroud)
  2. 仅适用于较新版本的 bash:
    docker logs nginx | &> grep "127"
    
    Run Code Online (Sandbox Code Playgroud)

这个语法是什么?

  • 标准输入 ( 0)
  • 标准输出 ( 1)
  • 标准误 ( 2)

该>运算符实际上默认用作1文件描述符编号,这就是为什么我们不需要指定1>重定向标准输出:( date 1> now.txt= date > now.txt)

全部一起

我们可以一次重定向多个流!在此示例中,我们连接两个文件,将标准输出重定向到名为“insects.txt”的文件,并将标准错误重定向到名为“error.txt”的文件。

cat bees.txt ants.txt > insects.txt 2> error.txt
Run Code Online (Sandbox Code Playgroud)
变得花哨

如果我们想将标准输出和标准错误重定向到同一个文件,我们可以这样做ls docs > output.txt 2> output.txt

或者我们可以使用2>&1一种奇特的语法来表示“将标准错误重定向到与标准输出相同的位置。

ls docs > output.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
变得更喜欢

较新版本的 bash 还支持一种更奇特的语法,用于将标准输出和标准错误重定向到同一文件:&>符号

ls docs &> output.txt
Run Code Online (Sandbox Code Playgroud)


Lio*_*ion 12

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

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

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

一些解释:

  • docker logs -f告诉 docker跟踪日志,因此过滤器也适用于新条目,例如使用查看它时tail -f
  • greps开关刷新每一行的输出,使用--line-buffered时需要实时 grepdocker logs -f
  • -E是一个扩展的正则表达式模式,需要应用我们的模式来允许我们返回不匹配的结果
  • --color突出显示匹配的部分(似乎是我的 Ubuntu 16.04 LTS 上的默认行为,但在其他发行版上可能不是,所以为了安全起见,我将其包含在此处)
  • *被转义以禁用其特殊的 glob 功能,其中(、 和)被屏蔽以避免其正则表达式含义为组,该功能由-Eswitch启用

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

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

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

在此输入图像描述


mii*_*otu 8

docker logs <container_name> 2>&1 | grep <string>
Run Code Online (Sandbox Code Playgroud)


小智 6

-f当我调试问题时,我通常也会将它与选项一起使用

docker logs -f nginx 2>&1 | grep "127."
Run Code Online (Sandbox Code Playgroud)

它将实时向我们展示我们的期望。

要包含时间戳,请添加 -t

docker logs -ft nginx 2>&1 | grep "127."
Run Code Online (Sandbox Code Playgroud)


jac*_*kav 5

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

docker logs nginx > stdout.log 2>stderr.log
cat stdout.log | grep "127."
Run Code Online (Sandbox Code Playgroud)

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


Ned*_*ajz 5

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

docker logs nginx 2>&1 | less
Run Code Online (Sandbox Code Playgroud)

  • 或者“docker log nginx |&amp; less”来减少一些字符:) (13认同)

kar*_*bal 5

您还可以使用匿名管道:

docker logs nginx 2> >(grep '127.')
Run Code Online (Sandbox Code Playgroud)