V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Tracy1997
V2EX  ›  Python

使用 docker 挂载文件后,flask api 的日志没有输出了?

  •  1
     
  •   Tracy1997 · 2019-08-06 17:33:33 +08:00 · 2120 次点击
    这是一个创建于 1922 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务需求给每个 api 上了一个 log 装饰器记录日志,写入到 flask_log/app.log ,代码如下:

    log_path = os.path.join(os.path.dirname(os.getcwd()), "flask_log") #没有 flask_log 文件就生成一个
    if not os.path.exists(log_path):
        os.mkdir(log_path)
    
    logging.basicConfig(level=logging.INFO)
    
    #写入到 app.log 文件
    handler = logging.handlers.RotatingFileHandler(os.path.join(log_path, "app.log"),  
                                                   'a', maxBytes=1024 * 1024 * 200, backupCount=max_log_count,
                                                   encoding="UTF-8")
    
    # 定制日志格式
    logging_format = logging.Formatter('pid:%(process)d - %(asctime)s - %(levelname)s '  
                                       '- %(filename)s:%(funcName)s[line:%(lineno)d] - %(message)s')
    handler.setFormatter(logging_format)
    
    # api 装饰器
    def log(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            try:
                response = func(*args, **kwargs)
            except Exception as e:
                current_app.logger.error(make_log_message(request, str(e)))
                return "Sorry, some error happened. Info:\n{}".format(e), 500
    
            current_app.logger.info(make_log_message(request, response)
            return response
    
        return wrapper
    

    在本机上测试没有问题,每次访问都会记录到 flask_log/app.log 中

    但是用 docker 部署之后就会出现问题: 控制台日志输出正常, app.log 也会正常创建。

    但是 app.log 一直为空不记录任何信息!

    docker 挂载代码如下:

    volumes:
          - /var/log/flask_log:/src/flask_log:rw  # docker 里面的 WORKDIR 为 /src
    
    第 1 条附言  ·  2019-08-07 17:24:05 +08:00
    查了下资料 docker-compose.yaml 中的 volumes 挂载似乎只能把宿主机的文件挂载到 docker 容器内。
    要想看 docker 里面的文件,只能用 docker cp 拷贝到宿主机。
    不知道有什么方法能把 docker 里面我这个 flask 日志文件映射到宿主机,而且是和 docker 里的日志文件的内容是同步的?
    6 条回复    2019-08-07 17:24:48 +08:00
    Tracy1997
        1
    Tracy1997  
    OP
       2019-08-07 08:50:29 +08:00
    有没有大佬看看是挂载出了问题吗?还是 docker 哪里有问题
    fyfy560
        2
    fyfy560  
       2019-08-07 09:21:16 +08:00
    可以检查一下
    /var/lib/docker/containers/<CONTAINER ID>/<CONTAINER ID>-json.log
    Tracy1997
        3
    Tracy1997  
    OP
       2019-08-07 11:00:47 +08:00
    @fyfy560 谢谢!看了一下,不过容器 log 里面似乎没有什么有用的信息。
    Tracy1997
        4
    Tracy1997  
    OP
       2019-08-07 12:07:55 +08:00
    救救孩子把
    wenqiang1208
        5
    wenqiang1208  
       2019-08-07 15:41:37 +08:00
    会不会是覆盖掉了
    Tracy1997
        6
    Tracy1997  
    OP
       2019-08-07 17:24:48 +08:00
    @wenqiang1208 应该不是 我进到 docker 容器内看 日志是正常记录的 就是没有同步映射到宿主机
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2756 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:58 · PVG 15:58 · LAX 23:58 · JFK 02:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.