在Flask中更改每个请求的日志级别

时间:2019-05-12 21:02:01

标签: python flask python-logging

我有一个Flask代码库,其中始终使用标准库的日志记录模块。我希望能够根据每个请求增加和减少日志级别。这样,通过设置查询字符串参数或类似的参数,我可以获取对我感兴趣的特定调试请求记录的跟踪或调试级别信息。

我知道Flask具有一个before_request和after_request装饰器,可用于提高和降低日志级别。但是,如果引发未处理的异常并阻止将日志级别重置为其默认级别,那将是一件不好的事情。是否有可靠的方法来设置和还原每个请求的日志级别?

我也不太熟悉日志记录模块如何与线程和Flask交互。如果多线程应用程序服务器正在运行我的Flask应用程序,记录器是否跨线程共享?我不想降低一个请求的日志级别,而让另一个无关的请求与第一个请求的记录器一起执行。

1 个答案:

答案 0 :(得分:0)

您可以使用Flask记录器创建子记录器:

@app.before_request
def before_request():
    if 'trace' in request.args:
        trace_logger = app.logger.getChild('trace')
        trace_logger.setLevel(logging.DEBUG)
        g._trace_logger = trace_logger

它将重新使用父级的配置。具体来说,它将使用您配置的处理程序和格式化程序,而不使用父级的日志级别或过滤器。记录器还通过g对象限制了请求的范围,因此它在其他请求中将不可用,从而使该设计成为线程安全的。

接下来,编写一个辅助函数:

def trace(*args, **kwargs):
    logger = getattr(g, '_trace_logger', None)
    if logger is not None:
        logger.debug(*args, **kwargs)

您可以使用此功能,就像整个代码库中的记录程序调用一样。 如果您不在跟踪模式下运行,则此功能为无操作。