Docker日志输出延迟问题定位

问题

Tensorflow容器训练日志总是有延迟,容器删除之后,日志一下子全吐出来了,因为我们是AutoML,有EarlyStopping功能,需要实时获取log,所以延迟问题必须解决。

思考

首先排除日志丢失,基本确定是缓冲问题。沿着这个思路Google,找到了解决方法,参考如何让 Docker 容器正常打印 Python 的日志。

解决之道

脚本日志通过print函数输出,所以在模板文件中增加容器环境变量PYTHONUNBUFFERED=0。

          env:
          - name: PYTHONUNBUFFERED
            value: 0

原文

为了方便记录,以下内容来自如何让 Docker 容器正常打印 Python 的日志。

在 Docker 容器里跑 Python 程序时,我们经常遇到通过print函数或者logging模块输出的信息在容器 log 中迷之失踪,过了好久又迷之出现。这是因为 Python 在写 stdout 和 stderr 的时候有缓冲区,导致输出无法实时更新进容器 log。

有如下几种方法解决:

  1. 增加环境变量
    对于使用print函数打印的内容,在运行容器时增加环境变量PYTHONUNBUFFERED=0就可以解决。

  2. 配置 logging 的 stream 参数
    import logging
    logging.basicConfig(stream=sys.stdout)
    这样,通过 logging 模块打印的日志都会直接写到标准输出 stdout。

或者自定义两个StreamHandler分别配置为输出到 stdout 和 stderr,来对不同 log 分别进行输出处理。

  1. WSGI server 配置参数
    如果是以 WSGI server 运行的 web 应用,以 gunicorn 为例,在 gunicorn 的启动命令中增加参数--access-logfile - --error-logfile -即可

你可能感兴趣的:(Docker日志输出延迟问题定位)