英文原文地址:http://flask.pocoo.org/docs/1.0/logging/
若有翻译错误或者不尽人意之处,请指出,谢谢~
Flask使用Python标准的logging。所有与Flask相关的信息都被记录在‘flask’记录器名称空间下。Flask.logger返回名为‘flask.app’的日志记录器,并且能在你的应用程序中被用来记录信息。
@app.route('/login', methods=['POST']) def login(): user = get_user(request.form['username']) if user.check_password(request.form['password']): login_user(user) app.logger.info('%s logged in successfully', user.username) return redirect(url_for('index')) else: app.logger.info('%s failed to log in', user.username) abort(401)
1. 基础配置
当你希望为你的项目配置日志记录时,你应该在程序启动时让其开始工作。如果在日志记录功能配置完成之前访问app.logger,它会添加一个默认处理程序。如果可能,才创建应用程序之前就配置日志记录功能。
这个示例使用了dictConfig()来创建类似于Flask默认的日志配置,除了所有的日志:
from logging.config import dictConfig dictConfig({ 'version': 1, 'formatters': {'default': { 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }}, 'handlers': {'wsgi': { 'class': 'logging.StreamHandler', 'stream': 'ext://flask.logging.wsgi_errors_stream', 'formatter': 'default' }}, 'root': { 'level': 'INFO', 'handlers': ['wsgi'] } }) app = Flask(__name__)
2. 默认配置
如果你没有配置你自己的日志记录,Flask会自动添加一个StreamHandler给app.logger。在请求期间,它会将流写入到WSGI服务器在environ['wsgi.errors']中指定的地方(通常是sys.stderr)。在请求之外,它会记录日志到sys.stderr。
3. 移除默认处理程序
如果你在访问了app.logger后才配置完日志记录,并且你需要移除默认处理程序,你可以导入并移除它:
from flask.logging import default_handler app.logger.removeHandler(default_handler)
4. 将错误信息通过邮件发送给管理员
当在远程服务器运行应用程序时,你可能不会经常查看这些日志信息。WSGI服务器可能会将日志信息发送到一个文件中,并且当有人告诉你程序运行错误的时候,你也只可能检查这个文件。
为了主动发现和修复Bug,你可以配置logging.handlers.SMTPHandler来发送邮件给自己,当然是在有错误发生并且等级很高的时候。
import logging from logging.handlers import SMTPHandler mail_handler = SMTPHandler( mailhost='127.0.0.1', fromaddr='[email protected]', toaddrs=['[email protected]'], subject='Application Error' ) mail_handler.setLevel(logging.ERROR) mail_handler.setFormatter(logging.Formatter( '[%(asctime)s] %(levelname)s in %(module)s: %(message)s' )) if not app.debug: app.logger.addHandler(mail_handler)
前提是你需要在同样的服务器上建立一个SMTP服务。你可以查阅Python文档来获取更多关于配置处理程序的知识。
5. 注入请求信息
查看更多关于请求的信息,比如IP地址,可能能帮助我们调试一些错误。你可以使用子类logging.Formatter来注入到你自己的字段中,这个字段就可以被用在信息中。你可以改变Flask默认处理程序的格式、邮件处理程序定义的格式,当然还有其他处理程序也是可以改变的。
from flask import request from flask.logging import default_handler class RequestFormatter(logging.Formatter): def format(self, record): record.url = request.url record.remote_addr = request.remote_addr return super().format(record) formatter = RequestFormatter( '[%(asctime)s] %(remote_addr)s requested %(url)s\n' '%(levelname)s in %(module)s: %(message)s' ) default_handler.setFormatter(formatter) mail_handler.setFormatter(formatter)
6. 其他库
其他库可能也会使用很多日志记录,并且你也会想要看到这些日志的相关信息。一个最简单的方式来实现:将这些处理程序添加到root的日志记录器中,而不是仅添加到应用程序的日志记录器。
from flask.logging import default_handler root = logging.getLogger() root.addHandler(default_handler) root.addHandler(mail_handler)
根据你的项目来看,分别配置你所关心的每个日志记录器可能会更有用,而不是仅仅配置root日志记录器。
for logger in ( app.logger, logging.getLogger('sqlalchemy'), logging.getLogger('other_package'), ): logger.addHandler(default_handler) logger.addHandler(mail_handler)
6.1 Werkzeug
Werkzeug将基本的请求/响应信息记录到‘werkzeug’日志记录器中。如果root日志记录器没有配置处理程序,Werkzeug会为它的日志记录器添加一个 StreamHandler。6.2 Flask扩展
根据不同的情形来看,一个扩展可能选择记录日志到app.logger或者它自己命名的日志记录器。有关详细信息,请查阅每个扩展的文档。