我正在用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()
函数进行猴子补丁。在
现在,这甚至适用于根记录程序。我不得不承认,我对monkey修补这个功能有点不舒服,但是它又回到了通常的基础设施上,所以它实际上并没有看上去那么脏。在
您最好使用一个})。在
logging.Filter
,它附加到您的记录器(或处理程序),它使用上下文删除事件(通过从filter
方法返回False
),或者允许记录事件(通过从filter
方法返回{虽然不完全适合您的用例,但我演示了在this post中使用线程本地上下文的过滤器。在
相关问题 更多 >
编程相关推荐