《flask日志logging一》flask官网介绍logging

官网地址:http://flask.pocoo.org/docs/dev/logging/

logging实例:

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

一、基本配置

logging的配置应在代码里尽量靠前的位置,最好是在程序对象创建之前,如果app.logger在logging配置的位置之前,系统会默认使用缺省配置。

 

dictConfig()实例:

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会自动添加StreamHandler到app.logger去完成默认配置。在请求期间,它将写入由WSGI服务器指定的流environ['wsgi.errors'](通常是 sys.stderr)。在请求之外,它将登录到sys.stderr。

 

三、删除默认配置

from flask.logging import default_handler

 

app.logger.removeHandler(default_handler)

 

四、给管理员发送报错Email

WSGI服务器可以发送日志消息文件,方便检查。配置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服务器。

 

五、注入请求信息

可以子类化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(RequestFormatter, self).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)

 

六、其他库

在其他库里也查看日志,可以向根logger添加处理程序,而不是应用程序logger。

from flask.logging import default_handler

 

root = logging.getLogger()

root.addHandler(default_handler)

root.addHandler(mail_handler)

根据具体情况分析,配置相应的logger可能更有用,而不是仅配置根logger。

for logger in (

    app.logger,

    logging.getLogger('sqlalchemy'),

    logging.getLogger('other_package'),

):

    logger.addHandler(default_handler)

    logger.addHandler(mail_handler)

 

七、Werkzeug

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

 

八、Flask扩展

根据具体情况,扩展程序可以选择登录app.logger或使用自定义名称的logger。

你可能感兴趣的:(Flask)