几年来,我以相同的方式使用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
Run Code Online (Sandbox Code Playgroud)
然后在某些模块中
logger = get_module_logger(__name__)
Run Code Online (Sandbox Code Playgroud)
现在,我正在运行一个在Docker容器中使用此功能的Python应用程序。我正在使用运行容器-d -i -t。当我在容器后进入容器时docker exec -it containername /bin/bash,如果我在生成日志的python脚本中执行命令,则可以看到日志。但是,从外面看,docker logs containername从不显示任何东西。我尝试PYTHONUNBUFFERED=0每运行几个Web帖子就运行我的容器,但这也没有帮助。尾随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
Run Code Online (Sandbox Code Playgroud)
编辑2:
~ docker --version
Docker version 1.11.0, build 4dc5990
Run Code Online (Sandbox Code Playgroud)
我能够看到日志输出,并且无法重现您的代码问题。
我创建了一个名为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!")
Run Code Online (Sandbox Code Playgroud)
运行以下命令:
docker run -d -v /tmp/tommy.py:/opt/tommy.py python:3.5 python /opt/tommy.py
Run Code Online (Sandbox Code Playgroud)
看到了:
$ docker logs -f sleepy_poincare
2016-08-30 17:01:36,026 [__main__ ] INFO HELLO WORLD!
Run Code Online (Sandbox Code Playgroud)
编辑:
这是我的Docker版本:
$ docker --version
Docker version 1.12.0, build 8eab29e
Run Code Online (Sandbox Code Playgroud)
Dun*_*nes -5
这是docker的问题,不是python的问题。使用 docker,实例内部看到的文件系统对于该实例来说是唯一的。所做的任何更改都不会反映在主机上。这是docker使用的联合文件系统的一个特性。
您可以使用“数据卷”在 docker 实例内的主机上安装目录。您可以将日志复制到 at 目录中,或者(将来)直接将日志记录到该目录中。
在 Unix 上:
docker run -v /Users/<path>:/<container path> ...
Run Code Online (Sandbox Code Playgroud)
在 Windows 上:
docker run -v /c/Users/<path>:/<container path> ...
Run Code Online (Sandbox Code Playgroud)
该目录将存在于联合文件系统之外,因此您无法对目录进行快照或回滚更改。
| 归档时间: |
|
| 查看次数: |
8173 次 |
| 最近记录: |