多年来,我一直以相同的方式使用 Python 的日志记录类:
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
之后进入容器时,如果我在生成日志的 python 脚本中执行命令,我可以看到日志。但是,从外部看,docker logs containername
从未显示任何内容。我已经尝试根据一些网络帖子使用 PYTHONUNBUFFERED=0
运行我的容器,但这也没有帮助。使用 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
编辑2:
~ docker --version
Docker version 1.11.0, build 4dc5990
最佳答案
我能够看到日志输出,但无法用您的代码重现您的问题。
我创建了一个名为 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 : logs gone 中的 Python 日志记录类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39226846/