前言
在排查docker问题的时候,查看日志是非常重要的一步,下面看看如何方便的使用docker日志。
docker查看日志的方式
- 查看完整日志
docker logs <容器名或容器ID>直接输出容器启动以来的所有日志。
- 查看尾部日志
docker logs --tail 500 <容器名>仅显示最近 500 条日志,避免信息过载。
- 按时间筛选
docker logs --since 1h <容器名>过滤最近 1 小时的日志,适合定位近期问题。
按照时间范围进行查询
docker logs --since "2025-07-09T00:00:00" --until "2025-07-09T12:00:00" <容器ID>
实时追踪日志
docker logs -f <容器名>
docker logs -f --tail 100 <容器名> # 实时跟踪最后100条日志
过滤日志
过滤日志可以配合grep进行查询
docker logs <容器ID> | grep "错误关键词" # 过滤含特定关键词的行 docker logs <容器ID> | grep -C 20 "超时" # 显示关键词前后20行
grep过滤日志不生效
使用docker log时输出的日志比较多,因此需要进行过滤,但是我使用grep过滤日志时一直无效。
实现可能有下面的原因
1.日志输出到 stderr 导致过滤失败
容器日志可能输出到标准错误(stderr),而管道默认只处理 stdout
docker logs <容器> 2>&1 | grep "关键词"
2.日志驱动格式不兼容
- 现象:grep 无法匹配日志内容
- 原因:Docker 使用非默认日志驱动(如 journald、syslog),导致日志格式变化。
- 解决:
- 检查日志驱动:docker inspect <容器> --format='{{.HostConfig.LogConfig.Type}}'
- 若需原始日志,直接查看 JSON 日志文件:
cat /var/lib/docker/containers/<容器ID>/*-json.log | grep "关键词"
3. 日志包含二进制或颜色代码
- 现象:报错 grep: (standard input): binary file matches
- 原因:日志中含二进制数据(如颜色控制符)。
- 解决:
bashCopy Code docker logs <容器> --no-color | grep --text "关键词"
--no-color 禁用颜色代码,--text 强制 grep 处理二进制内容。
4. 关键词匹配问题
- 排查步骤:
- 确认关键词存在:docker logs <容器> > log.txt 后手动检查文件。
- 检查大小写:grep -i 忽略大小写。
- 使用正则表达式:grep -E "error|fail" 匹配多模式。
5. 其他注意事项
- 容器未重启:修改配置后需重启容器生效(如 Redis 的 requirepass 配置)。
- 权限问题:确保有权限读取容器日志(需 sudo 或用户加入 docker 组)。