gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:23:58 25 4
gpt4 key购买 nike

我正在用 Python 制作一个 Web 应用程序框架的原型(prototype)(主要用于教育目的),但我一直坚持我想要的一个功能:每路由日志级别。

此功能的目标是识别我们正在执行诊断的一些特定入口点。例如,我想跟踪调用者点击 POST/sessions/login 时发生的情况。现在,我想获取此 URL 请求处理命中的代码的 100% 日志条目。这意味着一切,包括第 3 方应用程序中发生的一切。

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

问题是这与 Python 的日志库不太匹配,它以分层方式分解日志,这有利于分层(例如,通过应用层控制日志级别)。

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


问题:如何在 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() 函数进行猴子修补。

context = threading.local()

# Monkey patch "getEffectiveLevel()" to consult the current setting in the
# `context.log_level` thread-local storage. If that value is present, use
# it to override the current value; else, compute the level using the usual
# infrastructure.
default_getEffectiveLevel = logging.Logger.getEffectiveLevel
def patched_getEffectiveLevel(self):
level = getattr(context, 'log_level', logging.NOTSET)
if level == logging.NOTSET:
level = default_getEffectiveLevel(self)
return level
logging.Logger.getEffectiveLevel = patched_getEffectiveLevel

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

最佳答案

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

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

关于python - Python 中的上下文相关日志级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17517098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com