我不打算打开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)我对那里的选择感到不知所措,无法分辨我应该使用哪些选项。我应该打开哪些记录器,使用什么设置来复制本地python服务器调试,当我运行run.py时,我得到stdout?我发现默认的本地输出流非常有用,比页面中的交互式调试器更有用。有没有人有一个模式,他们可以分享设置复制这个与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
答案 0 :(得分:7)
在生产环境中运行应用程序时将config['PROPAGATE_EXCEPTIONS']
设置为True
,并且您希望将回溯记录到日志文件中。 (我没有尝试使用SMTP处理程序,但是..)
答案 1 :(得分:2)
if __name__ == '__main__'
子句中,即您的主要入口点。我认为那将是run.py
。nginx
级别更改任何内容。更新:您可能希望有一个涵盖未捕获异常的例外条款,例如
if __name__ == '__main__':
try:
app.run(debug=True)
except Exception:
app.logger.exception('Failed')
应该将app.run()
中发生的任何异常的回溯写入日志。
答案 2 :(得分:1)
我知道这是一篇非常古老的帖子,但我现在遇到了这个问题,我花了一些时间才找到解决方案。 Flask将错误发送到服务器。我在Ubuntu 14.04 LTS上使用upstart脚本运行Gunicorn,我发现错误日志的地方如下:
/var/log/upstart/myapp.log
http://docs.gunicorn.org/en/stable/deploy.html#upstart
以防万一其他可怜的灵魂在这种情况下结束。