关键在于精准过滤容器日志正文而非整行json,推荐用jq提取.log字段再grep;实时过滤需加--line-buffered;注意ansi字符、大小写、日志轮转及特殊字符处理。

直接用 grep 过滤容器标准输出日志,关键不是“能不能用”,而是“怎么用才不漏、不错、不卡”。容器日志(尤其是 Docker 默认的 json-file 驱动)本质是 JSON 格式文件,每行一条结构化记录,硬套 grep "ERROR" 往往能搜到,但容易误判、漏字段、或匹配到非日志主体内容(比如元数据里的字段)。下面分场景讲清楚。
先确认日志来源和格式
别跳过这步。执行:
docker inspect myapp | grep -A 5 LogConfig
看 LogDriver 是否为 json-file(默认),再查日志路径:
docker inspect myapp | grep LogPath
典型路径如:/var/lib/docker/containers/abc123.../abc123...-json.log。这个文件每行是一个 JSON 对象,含 log、time、stream 等字段。直接 grep "error" xxx-json.log 是在整行 JSON 上匹配,不是只搜日志内容。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
精准过滤日志正文(推荐做法)
用 jq 提取 log 字段后再 grep,最可靠:
jq -r '.log' /var/lib/docker/containers/xxx/xxx-json.log | grep -i "timeout"- 加行号便于定位:
jq -r '.log' xxx-json.log | grep -n -i "exception" - 想同时看时间戳:
jq -r 'select(.log | contains("panic")) | "\(.time) \(.log)"' xxx-json.log
如果没装 jq,可用 awk 粗略提取(适合简单场景):
awk -F'"log":"|","stream":"' '{print $2}' xxx-json.log | grep -i "failed"
实时跟踪并过滤(类似 tail -f + grep)
docker logs -f myapp 是流式输出,但不能直接管道给 grep 实现实时过滤(会阻塞)。正确姿势:
- 基础实时过滤:
docker logs -f myapp 2>&1 | grep --line-buffered -i "error"(--line-buffered强制逐行输出,避免缓冲延迟) - 带上下文(前2行+后1行):
docker logs -f myapp | grep --line-buffered -A1 -B2 -i "oom" - 过滤后高亮关键词:
docker logs -f myapp | grep --line-buffered -i "warn" | grep --color=always -E "(warn|WARN|Warn)"
注意常见陷阱
-
ANSI 控制字符干扰:容器日志可能含颜色转义符(如
\x1b[31m),导致grep匹配失败。先用cat -v查看真实内容,必要时清洗:docker logs myapp | sed 's/\x1b\[[0-9;]*m//g' | grep "exit code" -
大小写敏感:默认区分大小写,加
-i参数是基本操作 -
日志轮转后失效:
docker logs命令自动处理轮转,但直接读-json.log文件时,若日志被 rotate(如-json.log.1.gz),需用zgrep或解压后处理 -
空格和特殊字符:搜索含空格或正则元字符的内容(如
"HTTP 500"),用单引号包裹模式:grep -i 'HTTP 500' file,避免 shell 解析错误










