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> ...
此目录将存在于联合文件系统之外,因此您将无法使目录变形或回滚更改。