2

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

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

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

4

1 回答 1

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)

您可以使用此函数,就好像它是整个代码库中的记录器调用一样。如果您未在跟踪模式下运行,则该功能是无操作的。

于 2019-05-13T14:20:32.403 回答