Docker中的Python日志记录类:日志消失了

Tom*_*mmy 3 python docker

几年来,我以相同的方式使用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)

mik*_*ang 5

我能够看到日志输出,并且无法重现您的代码问题。

我创建了一个名为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)

该目录将存在于联合文件系统之外,因此您无法对目录进行快照或回滚更改。