Docker中的Python日志logging类:日志不见了

几年来,我用相同的方式使用了Python的日志logging类:

def get_module_logger(mod_name): """ To use this, do logger = get_module_logger(__name__) """ logger = logging.getLogger(mod_name) handler = logging.StreamHandler() formatter = logging.Formatter( '%(asctime)s [%(name)-12s] %(levelname)-8s %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) return logger 

然后在一些模块中,

 logger = get_module_logger(__name__) 

现在,我正在运行一个使用Docker容器内部的Python应用程序。 我用-d -i -t运行容器。 当我在docker exec -it containername /bin/bash后面的docker exec -it containername /bin/bash ,如果我在生成日志的python脚本中执行命令,我可以看到日志。 不过,从外面看, docker logs containername从不显示任何东西。 我试图运行我的容器与PYTHONUNBUFFERED=0每几个networking职位,这也没有帮助。 docker logs -f containername从不显示任何东西。 所以我所有的日志,stderr和stdout都是空的。 我也试过logging.StreamHandler(sys.stdout)但无济于事。

哪里不对? 我需要改变处理程序中的东西吗?

编辑:我的Dockerfile非常简单:

 FROM python:3.5.1 MAINTAINER tommy@... ADD . /tmp #need pip > 8 to have internal pypi repo in requirements.txt RUN pip install --upgrade pip #do the install RUN pip install /tmp/py/ CMD myservice 

EDIT2:

 ~ docker --version Docker version 1.11.0, build 4dc5990 

我能够看到日志输出,并不能用你的代码重现你的问题。

我创build了一个名为tommy.py的文件:

 import logging def get_module_logger(mod_name): """ To use this, do logger = get_module_logger(__name__) """ logger = logging.getLogger(mod_name) handler = logging.StreamHandler() formatter = logging.Formatter( '%(asctime)s [%(name)-12s] %(levelname)-8s %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) return logger if __name__ == "__main__": get_module_logger(__name__).info("HELLO WORLD!") 

如下:

 docker run -d -v /tmp/tommy.py:/opt/tommy.py python:3.5 python /opt/tommy.py 

看到这个:

 $ docker logs -f sleepy_poincare 2016-08-30 17:01:36,026 [__main__ ] INFO HELLO WORLD! 

编辑:
这是我的Docker版本:

 $ docker --version Docker version 1.12.0, build 8eab29e 

这是docker问题,而不是Python。 使用docker,实例中看到的文件系统对于该实例是唯一的。 所做的任何更改都不会反映在主机上。 这是docker使用的union文件系统的一个特性。

您可以使用“ 数据卷 ”在docker实例内的主机上安装一个目录。 您可以将日志复制到at目录,或者(将来)直接login到该目录。

在Unix上:

 docker run -v /Users/<path>:/<container path> ... 

在Windows上:

 docker run -v /c/Users/<path>:/<container path> ... 

此目录将存在于联合文件系统之外,因此您将无法使目录变形或回滚更改。