当前位置: 首页 > 知识库问答 >
问题:

在gunicorn内运行时,烧瓶应用程序记录器不工作

龙志勇
2023-03-14

我试图将来自一个非常简单的flask应用程序的应用程序日志消息保存在日志文件中。当我使用嵌入式Flask服务器运行应用程序时,这项功能完美无瑕,但在gUnicorn中运行时,它根本不起作用,基本上,运行gUnicorn时,不会将任何应用程序输出重定向到日志文件(我的Flask应用程序中指定的日志文件)或标准输出。

也就是说,这是我的烧瓶应用程序:

@app.route('/')
def index():
    app.logger.debug('Into /!!!!')
    print 'Will this print?'
    return 'Flask is running!'


if __name__ == '__main__':
    #Setup the logger
    file_handler = FileHandler('test.log')
    handler = logging.StreamHandler()
    file_handler.setLevel(logging.DEBUG)
    handler.setLevel(logging.DEBUG)
    file_handler.setFormatter(Formatter(
    '%(asctime)s %(levelname)s: %(message)s '
    '[in %(pathname)s:%(lineno)d]'))
    handler.setFormatter(Formatter(
    '%(asctime)s %(levelname)s: %(message)s '
    '[in %(pathname)s:%(lineno)d]'))
    app.logger.addHandler(handler)
    app.logger.addHandler(file_handler)
    app.run(debug=True)

现在,如果我以以下方式启动应用程序:

python app.py

我得到预期的输出:

 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat

--------------------------------------------------------------------------------
DEBUG in app [app.py:23]:
Into /!!!!
--------------------------------------------------------------------------------
2015-03-11 09:36:18,375 DEBUG: Into /!!!! [in app.py:23]
Will this print?
127.0.0.1 - - [11/Mar/2015 09:36:18] "GET / HTTP/1.1" 200 -

Tailing test.log,我明白了:

2015-03-11 09:36:18,375 DEBUG: Into /!!!! [in app.py:23]

到目前为止,一切看起来都很棒,然后当我尝试用nginx Gunicorn运行应用程序时,首先我尝试这样运行Gunicorn:

gunicorn app:app -b localhost:8000 --debug --log-level debug

应用程序正在工作,如果我去http://localhost:

curl http://localhost
Flask is running!

但是查看日志文件,它是空的,没有写入任何内容。我已经添加了777个权限,只是为了检查这是否是一个权限问题,但没有结果。然后看看gunicorn stdout,除了打印语句外,没有其他内容:

2015-03-11 09:42:06 [25641] [DEBUG] GET /
Will this print?

环顾四周,我尝试将所有输出重定向到gunicorn日志,然后像这样启动gunicorn:

gunicorn app:app -b localhost:8000 --debug --log-file /tmp/test.log --log-level debug --error-logfile /tmp/error.log

但是现在我甚至没有在gunicorn文件中得到print语句,这是test.log和error.log的输出(它们是相同的):

2015-03-11 09:46:17 [26257] [DEBUG]   tmp_upload_dir: None
2015-03-11 09:46:17 [26257] [DEBUG]   keyfile: None
2015-03-11 09:46:17 [26257] [DEBUG]   backlog: 2048
2015-03-11 09:46:17 [26257] [DEBUG]   logger_class: simple
2015-03-11 09:46:17 [26257] [INFO] Starting gunicorn 17.5
2015-03-11 09:46:17 [26257] [DEBUG] Arbiter booted
2015-03-11 09:46:17 [26257] [INFO] Listening at: http://127.0.0.1:8000 (26257)
2015-03-11 09:46:17 [26257] [INFO] Using worker: sync
2015-03-11 09:46:17 [26262] [INFO] Booting worker with pid: 26262
2015-03-11 09:48:15 [26262] [DEBUG] GET /

这里有一个非常类似的问题,其中一个答案似乎表明在gunicorn中运行时没有可用的应用程序记录器???这听起来,至少,很奇怪……那我该怎么记录呢?

另一个提议的解决方案似乎建议不要使用烧瓶记录器,但与Gunicorn无关(我认为)...

我错过了什么?我应该放弃gunicorn,转而使用Apache mod wsgi吗?Nginx-uWSGI?快速CGI?有什么想法吗?

谢谢亚历杭德罗

编辑:

我用uWGSI而不是gunicorn尝试了同样的设置,同样的行为,没有获得任何应用程序日志记录。

现在根据这个和另一个反应,我提出了这个(关于gUnicorn和uWSGI,在这两个版本中)

from flask import Flask
import logging
from logging import Formatter, FileHandler

app = Flask(__name__)

LOGGER = logging.getLogger('whatever')
file_handler = FileHandler('test.log')
handler = logging.StreamHandler()
file_handler.setFormatter(Formatter(
    '%(asctime)s %(levelname)s: %(message)s '
    '[in %(pathname)s:%(lineno)d]'
))
handler.setFormatter(Formatter(
    '%(asctime)s %(levelname)s: %(message)s '
    '[in %(pathname)s:%(lineno)d]'
))
LOGGER.addHandler(file_handler)
LOGGER.addHandler(handler)
LOGGER.setLevel(logging.INFO)

@app.route('/')
def hello():
    LOGGER.info('info log')
    LOGGER.debug('debug log')
    return 'Hello!'

if __name__ == '__main__':
    app.run()

gunicorn的输出:

2015-03-11 12:25:01 [11540] [INFO] Starting gunicorn 17.5
2015-03-11 12:25:01 [11540] [INFO] Listening at: http://127.0.0.1:8000 (11540)
2015-03-11 12:25:01 [11540] [INFO] Using worker: sync
2015-03-11 12:25:01 [11545] [INFO] Booting worker with pid: 11545
2015-03-11 12:26:20,765 INFO: info log [in /home/mosquito/www/flask-project/flask-project/app.py:24]

看着我的test.log档案:

2015-03-11 12:26:20,765 INFO: info log [in /home/mosquito/www/flask-project/flask-project/app.py:24]

所以,是的,它有点工作,但最初的问题仍然存在…为什么该死的烧瓶记录器在wsgi容器中运行时似乎不工作-gunicorn,uWSGI?

共有3个答案

房光临
2023-03-14

在Gunicorn 19.6中,-捕获-输出-启用-标准输入输出-继承似乎可以工作。

琴琪
2023-03-14

烧瓶使用Werkzeug的WSGI。您看到的“烧瓶日志”实际上来自Werkzeug的内置开发服务器,而不是烧瓶本身。

当您用Gunicorn或uWSGI之类的东西替换开发服务器时,您不会看到它的日志

调试器也是如此。即使只使用Werkzeug的调试器,也可以看到熟悉的“Flask调试页面”。

现在你知道了。:)

丁曦
2023-03-14

你在这里自己回答了你的问题。虽然我会添加我的答案,希望它能帮助其他有类似问题的人。

由于你的问题有两个部分,其中第一部分已经解决,我将对每个部分的回答进行标记:

第1部分:如果不是通过python直接运行应用程序,而是在gunicorn下运行,则不会发生日志记录。这是因为,当直接运行时,name=='main'为True,并且您的代码初始化了FileHandler和StreamHandler,日志记录工作正常。但是当运行gunicorn时,name=='main'将失败,因为name将包含模块的名称。这意味着不会初始化任何有效的处理程序。因此看不到日志记录。

第2部分:为什么烧瓶记录器在Gunicorn/uWSGI下默认不工作最新的烧瓶版本从头开始初始化app.logger,并默认附加一些处理程序,如DebugHandler,StreamHandler,具体取决于app.debug==True。记录器仍然不够,只能登录到STDERR。在过去的几个版本中,Gunicorn发生了多次变化。版本19.4.1没有将STDOUT和STDERR捕获到Gunicornerror.log.但是它确实提供了名为Gunicorn、gunicorn.access和gunicorn.error的记录器。最后一个有一个FileHandler写入到配置的error.log.如果您希望从烧瓶应用程序的日志转到error.log使用以下方法之一:方法1:

#only use gunicorn.error logger for all logging
LOGGER = logging.getLogger('gunicorn.error')
LOGGER.info('my info')
LOGGER.debug('debug message')
# this would write the log messages to error.log

方法二:

# Only use the FileHandler from gunicorn.error logger
gunicorn_error_handlers = logging.getLogger('gunicorn.error').handlers
app.logger.handlers.extend(gunicorn_error_handlers )
app.logger.addHandler(myhandler1)
app.logger.addHandler(myhandler2)
app.logger.info('my info')
app.logger.debug('debug message')

将推荐方法2,因为除了gunicorn.error.之外,您可以保留任何您想要的处理程序。此外,您可以根据条件选择不添加gunicorn.error处理程序。

谢啦

 类似资料:
  • 我希望能够运行我的破折号应用程序从我的烧瓶应用程序,当我去一个特定的网址/破折号。然而,我得到以下错误。TypeError:视图函数没有返回有效的响应。该函数要么返回无,要么结束时没有返回语句。' flaskapp.py dashapp。派克 如果我对我的flaskapp.py做以下更改, 我得到了以下错误,AttributeError:“非类型”对象没有属性“遍历”

  • 在过去的几周里,我花了太多的时间试图让它发挥作用。我的目标是使用烧瓶框架创建一个简单的网络应用程序,但我不断收到错误,几个小时的谷歌搜索和搜索stackoverflow也没有帮助。 我正在学习一个教程,该教程要求我运行:$python3 routes.py 只有我才能得到以下错误: 回溯(最近的最后一次调用):文件“routes.py”,第1行,从flask导入flask中,呈现\u模板导入错误:

  • 我试图在python中构建一个可以从XAMPP的Apache运行的应用程序,因此我安装了flask(),并按照以下说明进行mod_wsgi安装http://modwsgi.readthedocs.io/en/develop/user-guides/quick-installation-guide.html.我使用XAMPP的Apache,版本2.4.29和anaconda的python 3.6.4

  • 我最近在我的Flask应用程序中设置了日志记录,这样它就可以登录到文件和stdout。我插入了日志记录语句 以便在路由上运行pytest测试时可以看到日志记录消息。这工作了一段时间(记录到文件和控制台),但在某个时候,它停止记录到控制台,同时继续记录到日志文件。 我不确定是什么原因导致停止对stdout的日志记录。我想到的唯一一件事是,我曾尝试在测试模块中添加一个日志记录语句。这导致了一个错误,这

  • 我有一个烧瓶应用程序,我正试图过渡到通过gunicorn运行。我在这方面遇到了很多问题。以下是我的应用程序的运行代码: 首先,如果DEBUG_FLAG==true,应用程序将永远不会真正启动,但会继续重新启动,在本地点击它将不起作用。它只是一次又一次地这样做: 如果我用DEBUG_FLAG==False启动它,它实际上会启动并服务于一些请求,但由于未知原因,它仍然会频繁中断并重新启动: 如前所述,

  • 我是python新手,我想制作一个浏览器控制的软件,在我的raspberry pi上运行。 这是我的Main()函数,从大多数代码中剥离出来以关注问题: 如果我运行这个脚本,我注意到在控制台中脚本运行了两次(打印“启动flaskserver”): test.html只包含一个标题... 我做错了什么? 问候