如何使用烧瓶中的请求信息来丰富日志消息?
问题描述:
我有,这些会用来象一个REST API实现许多方法这样的小瓶的应用:如何使用烧瓶中的请求信息来丰富日志消息?
@route('/do/something', methods=['POST'])
def something():
app.logger.debug("got request to /do/something")
result = something_implementation(request.json())
app.logger.debug("result was %s", str(result))
return flask.Response(result)
我想与从请求对象信息自动丰富这些日志信息如头信息,零件的身体和其他任何方便。
我如何以优雅和pythonic的方式做到这一点?
当然,我可以在我自己的函数中包装app.logger,并将请求对象和消息一起传递,但必须有更好更简单的方法。
答
我已经通过继承logging.Filter
并将其添加到我的处理程序解决了这个。
事情是这样的:
class ContextFilter(logging.Filter):
'''Enhances log messages with contextual information'''
def filter(self, record):
try:
record.rid = request.rid
except RuntimeError as exc:
if str(exc.message) == 'working outside of request context':
record.rid = ''
else:
raise exc
return True
在try/except子句是必要的日志信息工作的请求上下文之外。 然后用它是这样的:
fileHandler = RotatingFileHandler(app.config['LOGFILE'], maxBytes=20971520,
backupCount=5, encoding='utf-8')
fileHandler.setLevel(logging.DEBUG)
fileHandler.addFilter(ContextFilter())
filefmt = '%(asctime)s [%(filename)s:%(lineno)d] %(rid)s: %(message)s'
fileFormatter = logging.Formatter(filefmt)
fileHandler.setFormatter(fileFormatter)
app.logger.addHandler(fileHandler)
在未来,我可以在ContextFilter.filter()
方法添加更多的字段,并使用它们,但是我请格式化配置。
答
我通常包括我app.py文件这样的事情记录调试信息对于每个请求,以处理标准误差一起:
# Useful debugging interceptor to log all values posted to the endpoint
@app.before_request
def before():
values = 'values: '
if len(request.values) == 0:
values += '(None)'
for key in request.values:
values += key + ': ' + request.values[key] + ', '
app.logger.debug(values)
# Useful debugging interceptor to log all endpoint responses
@app.after_request
def after(response):
app.logger.debug('response: ' + response.status + ', ' + response.data.decode('utf-8'))
return response
# Default handler for uncaught exceptions in the app
@app.errorhandler(500)
def internal_error(exception):
app.logger.error(exception)
return flask.make_response('server error', 500)
# Default handler for all bad requests sent to the app
@app.errorhandler(400)
def handle_bad_request(e):
app.logger.info('Bad request', e)
return flask.make_response('bad request', 400)v
谢谢。我已经有了类似的东西,但这还不够,我需要记录处理请求时发生了什么。看起来我需要实现一个自定义过滤器:https://docs.python.org/2/howto/logging-cookbook.html#using-filters-to-impart-contextual-information 我只需要找出如何从此过滤器访问当前的请求上下文。 – Patrick