Flask1.0.2系列(九) 记录日志

英文原文地址: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会自动添加一个StreamHandlerapp.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或者它自己命名的日志记录器。有关详细信息,请查阅每个扩展的文档。


猜你喜欢

转载自blog.csdn.net/regandu/article/details/80190798
今日推荐