我有一个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语句中,并使用traceback找出错误来自哪一行,并打印出一条漂亮的错误消息:
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')
)获取一条错误日志消息并保存到文件中,但它只打印这一条消息。直接在该错误之后记录另一个错误的尝试将被忽略。
https://stackoverflow.com/questions/14037975
复制相似问题