首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么当Gunicorn托管时,Flask应用程序不创建任何日志?

为什么当Gunicorn托管时,Flask应用程序不创建任何日志?
EN

Stack Overflow用户
提问于 2014-10-26 22:31:30
回答 3查看 55K关注 0票数 76

我正在尝试添加登录到一个web应用程序,它使用的是烧瓶。

当使用内置服务器(即python3 server.py)托管时,日志记录工作。使用Gunicorn托管时,不创建日志文件。

再现问题的最简单代码是:

代码语言:javascript
运行
复制
#!/usr/bin/env python

import logging
from flask import Flask
flaskApp = Flask(__name__)


@flaskApp.route('/')
def index():
    flaskApp.logger.info('Log message')
    print('Direct output')
    return 'Hello World\n'


if __name__ == "__main__":
    logHandler = logging.FileHandler('/var/log/demo/app.log')
    logHandler.setLevel(logging.INFO)
    flaskApp.logger.addHandler(logHandler)
    flaskApp.logger.setLevel(logging.INFO)
    flaskApp.run()

使用以下方法调用该应用程序:

代码语言:javascript
运行
复制
gunicorn server:flaskApp -b :80 -w 4
    --access-gfile /var/log/demo/access.log
    --error-logfile /var/log/demo/error.log

当对站点主页执行请求时,会发生以下情况:

  1. 我收到了预期的HTTP 200 "Hello \n“作为响应。
  2. /var/log/demo/access.log中有一个请求的跟踪。
  3. /var/log/demo/error.log保持不变(只有引导事件)。
  4. 终端中有“直接输出”线。
  5. 没有'/var/log/demo/app.log‘。如果我在启动应用程序之前创建了该文件,则不会修改该文件。

请注意:

  • 每个人都可以访问目录/var/log/demo (读、写、执行),所以这不是权限问题。
  • 如果我将StreamHandler作为第二个处理程序添加,那么无论是在终端还是Gunicorn日志文件中都没有“日志消息”消息的跟踪。
  • Gunicorn是使用pip3 install gunicorn安装的,因此不应该与Python版本不匹配。

发生什么事了呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-27 00:16:12

当您使用python3 server.py时,您正在运行server3.py脚本。

当您使用gunicorn server:flaskApp ...时,您正在运行gunicorn启动脚本,然后导入模块server并在该模块中查找变量flaskApp

由于正在导入server.py,因此__name__ var将包含"server",而不是"__main__",因此您不会运行日志处理程序设置代码。

您只需将日志处理程序设置代码移出if __name__ == "__main__":节。但是,请确保将flaskApp.run()保存在其中,因为您不希望在gunicorn导入server时运行它。

更多关于做?的信息

票数 48
EN

Stack Overflow用户

发布于 2016-06-02 15:19:34

这种方法适用于我:导入Python日志模块并向其添加gunicorn的错误处理程序。然后,您的记录器将登录到gunicorn错误日志文件中:

代码语言:javascript
运行
复制
import logging

app = Flask(__name__)

gunicorn_error_logger = logging.getLogger('gunicorn.error')
app.logger.handlers.extend(gunicorn_error_logger.handlers)
app.logger.setLevel(logging.DEBUG)
app.logger.debug('this will show in the log')

我的Gunicorn启动脚本被配置为将日志条目输出到如下文件:

代码语言:javascript
运行
复制
gunicorn main:app \
    --workers 4 \
    --bind 0.0.0.0:9000 \
    --log-file /app/logs/gunicorn.log \
    --log-level DEBUG \
    --reload
票数 57
EN

Stack Overflow用户

发布于 2020-05-24 19:00:05

这背后有几个原因: Gunicorn有自己的记录器,它通过这种机制控制日志级别。解决这个问题的方法是添加app.logger.setLevel(logging.DEBUG)。

但是这种方法有什么问题呢?首先,这是硬编码到应用程序本身。是的,我们可以将其重构为一个环境变量,但是我们有两个不同的日志级别:一个用于Flask应用程序,另一个用于Gunicorn,它是通过- log级参数设置的(例如“调试”、“信息”、“警告”、“错误”和“关键”)。

解决这个问题的一个很好的解决方案是下面的片段:

代码语言:javascript
运行
复制
import logging
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def default_route():
    """Default route"""
    app.logger.debug('this is a DEBUG message')
    app.logger.info('this is an INFO message')
    app.logger.warning('this is a WARNING message')
    app.logger.error('this is an ERROR message')
    app.logger.critical('this is a CRITICAL message')
    return jsonify('hello world')

if __name__ == '__main__':
    app.run(host=0.0.0.0, port=8000, debug=True)

else:
    gunicorn_logger = logging.getLogger('gunicorn.error')
    app.logger.handlers = gunicorn_logger.handlers
    app.logger.setLevel(gunicorn_logger.level)

参考文献:代码和解释摘自这里。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26578733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档