在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分别进行输出处理。

3. WSGI server配置参数

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