使用 nginx、uwsgi、flask 轻松进行应用程序日志记录/调试?

Posted

技术标签:

【中文标题】使用 nginx、uwsgi、flask 轻松进行应用程序日志记录/调试?【英文标题】:Easy application logging/debugging with nginx, uwsgi, flask? 【发布时间】:2013-04-14 00:05:20 【问题描述】:

我不想打开dangerous debugging console,但我的应用程序出现 500 错误,并且似乎没有为我编写任何输出以进行更深入的调查。

我看到了this exchange on the mailing list,这导致了我to this page on logging errors。

但是,我仍然觉得这很令人困惑,并且有几个问题:

(1) 下面的内容应该放在哪个文件中?

ADMINS = ['yourname@example.com']
if not app.debug:
    import logging
    from logging.handlers import SMTPHandler
    mail_handler = SMTPHandler('127.0.0.1',
                               'server-error@example.com',
                               ADMINS, 'YourApplication Failed')
    mail_handler.setLevel(logging.ERROR)
    app.logger.addHandler(mail_handler)

...假设大型应用程序的“变大”文件模式? __init__.py? config.py? run.py?

(2) 我对那里的选项感到不知所措,不知道应该使用哪个。当我运行 run.py 时,我应该打开哪些记录器,使用什么设置来复制本地 python 服务器调试到标准输出?我发现默认的本地输出流非常有用,比页面中的交互式调试器更有用。有没有人可以分享一种模式,他们可以通过 nginx 部署来设置复制此内容并输出到日志?

(3) 有什么我需要改变的,不是在烧瓶级别,而是在 nginx 中,比如在我的/etc/nginx/sites-available/appname 文件中,以启用日志记录?

更新

具体来说,我正在寻找当 python 在本地运行时获得的信息,例如为什么包不工作,或者我的语法错误可能在哪里,或者什么变量不存在:

$ python run.py 
Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from myappname import app
  File "/home/me/myappname/myappname/__init__.py", line 27, in <module>
    file_handler.setLevel(logging.debug)
  File "/usr/lib/python2.7/logging/__init__.py", line 710, in setLevel
    self.level = _checkLevel(level)
  File "/usr/lib/python2.7/logging/__init__.py", line 190, in _checkLevel
    raise TypeError("Level not an integer or a valid string: %r" % level)

当我在服务器上运行烧瓶时,我从来没有看到过这个。我只是在浏览器中收到一个 uWSGI 错误,并且不知道哪个代码有问题。我只想将上面的内容写入文件。

我还注意到,设置以下日志记录并没有真正向文件写入太多内容,即使我将日志调高到 DEBUG 级别:

from logging import FileHandler
file_handler = FileHandler('mylog.log')
file_handler.setLevel(logging.DEBUG)
app.logger.addHandler(file_handler)

mylog.log 为空白,即使我的应用程序出错。

我还要补充一点,我尝试在__init__.py 中通过以下方式设置 debug = True:

app = Flask(__name__)
app.debug = True
app.config['DEBUG'] = True
from werkzeug.debug import DebuggedApplication
app.wsgi_app = DebuggedApplication(app.wsgi_app, True)
app.config.from_object('config')
app.config.update(DEBUG=True)
app.config['DEBUG'] = True
if __name__ == '__main__':
    app.run(debug=True)

在我的 config.py 文件中,我有...

debug = True
Debug = True
DEBUG = True

然而,没有调试发生,而且没有日志记录或调试,这很难追踪。错误只是用无用的浏览器消息终止应用程序:

uWSGI Error
Python application not found

【问题讨论】:

我根据您更新的问题更新了我的答案。 你解决了这个问题吗? 我没有。无法托管生产机器,放弃烧瓶。 我的猜测,现在回想起来可能是我没有权限写入应用程序所在的任何服务器目录,并指定其他地方写入日志会处理它。 【参考方案1】:

我知道这是一个非常古老的帖子,但我现在遇到了这个问题,我花了一些时间才找到解决方案。 Flask 将错误发送到服务器。我在 Ubuntu 14.04 LTS 上用 upstart 脚本运行 Gunicorn,发现错误日志的地方如下:

/var/log/upstart/myapp.log

http://docs.gunicorn.org/en/stable/deploy.html#upstart

以防万一其他可怜的灵魂落入这种境地。

【讨论】:

【参考方案2】:

在生产环境中运行应用程序时将config['PROPAGATE_EXCEPTIONS'] 设置为True,并且您希望将回溯记录到日志文件中。 (不过,我还没有尝试过使用 SMTP 处理程序..)

【讨论】:

【参考方案3】:
    您创建处理程序、添加到记录器等的部分应该在if __name__ == '__main__' 子句中,即您的主要入口点。我假设是run.py。 我不确定我能否回答这个问题 - 这取决于您想要什么。我建议查看logging tutorial 以查看可用的各种选项。 我认为您不需要在 nginx 级别更改任何内容。

更新:您可能希望有一个涵盖未捕获异常的异常子句,例如

if __name__ == '__main__':
    try:
        app.run(debug=True)
    except Exception:
        app.logger.exception('Failed')

应该将app.run()中发生的任何异常的回溯写入日志。

【讨论】:

以上是关于使用 nginx、uwsgi、flask 轻松进行应用程序日志记录/调试?的主要内容,如果未能解决你的问题,请参考以下文章

我应该为 Flask、uWSGI 和 nginx 提供单独的容器吗?

uWSGI+Nginx+Flask在Linux下的部署

CentOS7下python3+Flask+uWSGI+Nginx+Supervisor环境搭建

nginx+uwsgi+flask搭建后怎么访问.py文件

flask+uwsgi+nginx+docker-compose部署

用uWSGI和Nginx部署Flask项目