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

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

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

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

参考方案

您可以使用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)

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

Python:传递记录器是个好主意吗? - python

我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Flask-RESTful-返回自定义响应格式 - python

我已经按照以下Flask-RESTful文档定义了自定义响应格式。app = Flask(__name__) api = restful.Api(app) @api.representation('application/octet-stream') def binary(data, code, headers=None): resp =…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…

Flask_SQLAlchemy无法像SQLAlchemy那样反映数据库 - python

我正在尝试使用python-Flask将Foreigner Database连接到Flask_SQLALchemy应用我到处都看过,包括FLASK_SQLALCHEMY official doc 过去4天里,我一直在Internet上到处寻找FLASK_SQLALCHEMY中没有ORM库的任何教程,但运气不佳我一直在查看SQLAlchemy Reflecti…