拦截 Python 中的所有日志记录
Posted
技术标签:
【中文标题】拦截 Python 中的所有日志记录【英文标题】:Intercept all logging in Python 【发布时间】:2017-03-14 14:15:28 【问题描述】:我是 Python 新手,甚至更熟悉 Python 日志记录。
我的情况是,我有一个系统,我需要通过该过程跟踪数据。所以我决定使用 Python 的日志系统本身来跟踪信息。
最初我创建了一个新的日志记录处理程序,在发出函数中它将记录器发送到另一台服务器,前提是记录器在其extra
属性中有一些我用来跟踪的变量。
到目前为止一切顺利,在所有日志中(从调试到关键)我都可以跟踪数据。我的问题是,如果有人将LogLevel
设置为critical
并且我正在使用LogLevel
info
跟踪数据,我将无法获得跟踪,因为不会处理日志。
我想到了两种解决方案。首先,创建一个自定义LogLevel
用于跟踪,我认为这不是正确的选择。第二个,我认为是正确的,是截取所有日志,并检查其中是否有额外的变量。如果日志有,不管日志级别,我都会以任何方式将日志发送到服务器。
由于我是 Python 新手,我无法理解日志系统的工作原理。我的处理程序中是否需要另一个函数?我需要创建自定义 LogRecord 吗?
class RQHandler(logging.Handler):
def __init__(
self, formatter=JSONFormatter(), level=logging.NOTSET,
connection_pool=None
):
# run the regular Handler __init__
logging.Handler.__init__(self, level)
self.formatter = formatter
def emit(self, record):
# Send to the other
...
【问题讨论】:
【参考方案1】:在logging
模块中,Handler
是Filterer
的子类,有filter(self, record)
方法
看起来一个简单的解决方案可能是覆盖RQHandler
中的filter
方法。
查看原始的Filterer
代码,看看它首先在做什么,但您应该能够将其覆盖为return True
,以强制LogRecord
始终为emit
ted。
【讨论】:
以上是关于拦截 Python 中的所有日志记录的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework Core中的日志记录与拦截器