拦截 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模块中,HandlerFilterer的子类,有filter(self, record)方法

看起来一个简单的解决方案可能是覆盖RQHandler 中的filter 方法。 查看原始的Filterer 代码,看看它首先在做什么,但您应该能够将其覆盖为return True,以强制LogRecord 始终为emitted。

【讨论】:

以上是关于拦截 Python 中的所有日志记录的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core中的日志记录与拦截器

Entity Framework Core 中的日志记录与拦截器

用户操作拦截并作日志记录--自定义注解+AOP拦截

所有 Python 程序员必须要学会的「日志」记录。

Django 中的 Python 日志记录

拦截所有经过IOC的方法