日志记录 — Flask 文档

来自菜鸟教程
Flask/docs/2.0.x/logging
跳转至:导航、​搜索

日志记录

Flask 使用标准 Python logging。 有关 Flask 应用程序的消息使用 app.logger 记录,其名称与 app.name 相同。 此记录器还可用于记录您自己的消息。

@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)

如果您不配置日志记录,Python 的默认日志级别通常是“警告”。 低于配置级别的任何内容都将不可见。

基本配置

当您想为您的项目配置日志记录时,您应该在程序启动时尽快进行。 如果在配置日志记录之前访问 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__)

默认配置

如果你自己不配置日志,Flask 会自动给 app.logger 添加一个 StreamHandler。 在请求期间,它会写入由 WSGI 服务器指定的 environ['wsgi.errors'] 中的流(通常是 sys.stderr)。 在请求之外,它将登录到 sys.stderr


删除默认处理程序

如果您在访问 app.logger 后配置了日志记录,并且需要删除默认处理程序,则可以导入和删除它:

from flask.logging import default_handler

app.logger.removeHandler(default_handler)

向管理员发送电子邮件错误

在远程服务器上运行应用程序进行生产时,您可能不会经常查看日志消息。 WSGI 服务器可能会将日志消息发送到一个文件,如果用户告诉您出现问题,您只会检查该文件。

为了主动发现和修复错误,您可以配置 logging.handlers.SMTPHandler 以在记录错误及更高级别时发送电子邮件。

import logging
from logging.handlers import SMTPHandler

mail_handler = SMTPHandler(
    mailhost='127.0.0.1',
    fromaddr='server-error@example.com',
    toaddrs=['admin@example.com'],
    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 文档。


注入请求信息

查看有关请求的更多信息(例如 IP 地址)可能有助于调试一些错误。 您可以将 logging.Formatter 子类化以注入您自己的可用于消息的字段。 您可以更改 Flask 的默认处理程序、上面定义的邮件处理程序或任何其他处理程序的格式化程序。

from flask import has_request_context, request
from flask.logging import default_handler

class RequestFormatter(logging.Formatter):
    def format(self, record):
        if has_request_context():
            record.url = request.url
            record.remote_addr = request.remote_addr
        else:
            record.url = None
            record.remote_addr = None

        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)

其他图书馆

其他库可能会广泛使用日志记录,您也希望从这些日志中查看相关消息。 最简单的方法是将处理程序添加到根记录器,而不仅仅是应用程序记录器。

from flask.logging import default_handler

root = logging.getLogger()
root.addHandler(default_handler)
root.addHandler(mail_handler)

根据您的项目,单独配置您关心的每个记录器可能更有用,而不是仅配置根记录器。

for logger in (
    app.logger,
    logging.getLogger('sqlalchemy'),
    logging.getLogger('other_package'),
):
    logger.addHandler(default_handler)
    logger.addHandler(mail_handler)

工匠

Werkzeug 将基本请求/响应信息记录到 'werkzeug' 记录器。 如果根记录器没有配置处理程序,Werkzeug 会向其记录器添加 StreamHandler


烧瓶扩展

根据情况,扩展可以选择登录到 app.logger 或它自己命名的记录器。 有关详细信息,请参阅每个扩展的文档。