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

Changing log levels per request in Flask

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

我知道 Flask 有一个 before_request 和 after_request 装饰器,可以用来提高和降低日志级别。但是,如果抛出未处理的异常并阻止日志级别重置为默认级别,那将是一个糟糕的交易。是否有可靠的方法来设置和恢复每个请求的日志级别?

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

您可以使用 Flask 记录器创建一个 child 记录器:

@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

它将re-use parent 的配置。具体来说,它将使用您配置的处理程序和格式化程序,但不使用 parent 的日志级别或过滤器。记录器也通过 g object 限制在请求范围内,因此它在其他请求中不可用,因此设计 thread-safe.

接下来写一个辅助函数:

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

您可以像在整个代码库中调用记录器一样使用此函数。 如果您不 运行 处于跟踪模式,则函数是 no-op.