我有一个运行良好的 Flask 应用程序,偶尔会产生错误,当它运行时可见debug=True
:
if __name__ == '__main__':
app.run(debug=True)
我收到有用的错误消息,例如:
Traceback (most recent call last):
File "./main.py", line 871, in index_route
KeyError: 'stateIIIII'
当我在生产中运行应用程序(使用 Lighttpd + fastcgi)时,我希望将这些错误消息保存到文件中。
在查看了各种 StackOverflow 问题后(http://flask.pocoo.org/docs/errorhandling/、http://docs.python.org/2/library/logging.html等);Flask 邮件列表;和一些博客,似乎没有简单的方法将所有重要的错误消息发送到文件 - 我需要使用 Python 日志记录模块来自定义内容。所以我想出了以下代码。
在我的应用程序文件的顶部,我有各种导入,然后是:
app = Flask(__name__)
if app.debug is not True:
import logging
from logging.handlers import RotatingFileHandler
file_handler = RotatingFileHandler('python.log', maxBytes=1024 * 1024 * 100, backupCount=20)
file_handler.setLevel(logging.ERROR)
app.logger.setLevel(logging.ERROR)
app.logger.addHandler(file_handler)
然后,我将每个路由的代码放在 try/except 语句中,并使用回溯来确定错误来自哪一行并打印出一条不错的错误消息:
def some_route():
try:
# code for route in here (including a return statement)
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
app.logger.error(traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2))
return render_template('error.html')
然后在文件的末尾,我删除了该debug=True
语句。虽然我认为我不需要这样做,因为该应用程序在生产中运行时由 fastcgi 服务器(?)运行。我的应用程序代码的最后两行如下所示:
if __name__ == '__main__':
app.run()
我正在努力让这个工作。我认为我所管理的最好方法是使用 () 将一条错误日志消息保存在文件中app.logger.error('test message')
,但它只打印一条消息。在该错误之后直接记录另一个错误的尝试将被忽略。