docker logs -f无法使用grep检索出关键字
背景
使用docker logs -f <container-name> | grep "abc"检索关键字时,期望能够过滤出包含abc字符的日志内容,可实际输出的结果并无过滤效果,即输出的结果跟执行docker logs -f <container-name>的效果是一致的。在项目中碰到这个问题,一开始一头雾水,特别的反直觉。
原因
docker logs 命令会输出两个流:
stdout(标准输出)
stderr(标准错误)
grep 只过滤 stdout,stderr 会直接穿透显示。
grep 的工作方式: grep 会过滤匹配的行,但如果这些日志是从 stderr 输出的,grep 无法过滤它们。
检查项目的 logging_config.py 配置发现设置了 logging.StreamHandler(sys.stderr)),所有的日志都输出到了 stderr,导致了 grep 功能失效。
解决方案
1. 需要将 stderr 和 stdout 都重定向到 grep:
docker logs -f <container-name> 2>&1 | grep "abc"
加上了 2>&1 后,将日志内容强制输入至 stdout,过滤功能恢复了。
2. 修改logging_config.py 配置:
logging.StreamHandler(sys.stdout)),重启项目,这样就不需要加上 2>&1 了。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)