几年来,我以相同的方式使用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脚本中执行命令,则可以看到日志.但是,从外部来看,泊坞窗日志容器名从不显示任何内容.我已经尝试通过一些Web帖子以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
最佳答案
我能够看到日志输出,并且无法重现您的代码问题.
原文链接:https://www.f2er.com/docker/532668.html我创建了一个名为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