Python中上下文相关的日志级别

2024-09-19 23:39:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python构建一个web应用程序框架的原型(主要是出于教育目的),但我一直坚持一个我一直想要的特性:每个路由日志级别。在

此功能的目标是确定我们正在执行诊断的某些特定入口点。例如,我想跟踪呼叫者点击POST /sessions/login时发生了什么。现在,我想获得这个URL的请求处理所命中代码的100%日志条目。这意味着一切,包括第三方应用程序中发生的一切。在

示例:虚构的应用程序有两个路径:/sessions/login和{}。两个请求处理程序命中包users中的相同数据库代码,该包使用logger myapp.users.db。对/sessions/login的请求处理应在记录器myapp.users.db上发出日志消息,但/sessions/info的请求处理不应发出。在

问题是这与Python的日志库不太匹配,Python的日志库以分层的方式分解日志,这种方式很适合分层(例如,通过应用程序层控制日志级别)。在

我真正想要的是上下文相关的日志级别。想到的自然实现是使logger.getEffectiveLevel()返回线程本地日志级别(如果请求URL需要调试,调试中间件会有条件地降低日志级别以进行调试)。但是,我正在查看Python文档中的logging flow,我不知道如何使用许多不同类型的配置钩子来实现这一点。在


问题:如何在Python中实现上下文相关的日志级别?在


更新:我找到了部分解决方案。在

context = threading.local()

class ContextualLogger(logging.Logger):
    def getEffectiveLevel(self):
        global context
        level = getattr(context, 'log_level', logging.NOTSET)
        if level == logging.NOTSET:
            level = super(ContextualLogger, self).getEffectiveLevel()
        return level

logging.setLoggerClass(ContextualLogger)

但是,这对根记录器不起作用。有什么想法吗?在


更新:也可以对getEffectiveLevel()函数进行猴子补丁。在

^{pr2}$

现在,这甚至适用于根记录程序。我不得不承认,我对monkey修补这个功能有点不舒服,但是它又回到了通常的基础设施上,所以它实际上并没有看上去那么脏。在


Tags: 代码功能应用程序urlloggingcontextloginlogger
1条回答
网友
1楼 · 发布于 2024-09-19 23:39:23

您最好使用一个logging.Filter,它附加到您的记录器(或处理程序),它使用上下文删除事件(通过从filter方法返回False),或者允许记录事件(通过从filter方法返回{})。在

虽然不完全适合您的用例,但我演示了在this post中使用线程本地上下文的过滤器。在

相关问题 更多 >