官网地址: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。