在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
你可以使用这些:
docker logs nginx 2>&1 | grep "127."
Run Code Online (Sandbox Code Playgroud)
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--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,则可以省略该开关。在这两种情况下,您都会看到带有突出显示的搜索词的整个日志,如下所示:
小智 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)
跟进评论并为遇到此问题的其他人澄清这一点。这是我可以看到的搜索 nginx 容器日志的最简单方法。
docker logs nginx > stdout.log 2>stderr.log
cat stdout.log | grep "127."
Run Code Online (Sandbox Code Playgroud)
IMO 有点乱,因为您需要创建和删除这些可能非常大的文件。希望我们能得到一些工具,让它更方便一些。
作为vim爱好者,我更喜欢使用less和搜索/
docker logs nginx 2>&1 | less
Run Code Online (Sandbox Code Playgroud)