Python日志记录-过滤所有记录器的日志消息

时间:2020-01-15 09:07:49

标签: python logging

我有一个项目,其中记录了底层工具,而且我也在记录(使用不同的记录器实例)。

但是,有时我无权访问的记录器会公开我想从日志中删除的信息(或替换为占位符)。

是否可以使用过滤器为项目中的 所有 python记录器执行此操作?

这是我在Django中的日志记录配置:

LOGGING_CONFIG = None
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "my_formatter": {
            "format": "[%(asctime)s] %(message)s",
            "datefmt": "%d/%b/%Y %H:%M:%S",
        },
    },
    "handlers": {
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",
            "formatter": "my_formatter",
        },
    },
    "loggers": {
        "my_logger": {
            "handlers": ["console"],
            "level": "DEBUG"
        },
    },
}

logging.config.dictConfig(LOGGING)

真的,我的最终目标是通过替换某些记录来防止某些事情突然出现在日志中-如果还有其他方法可以做到,请随时共享。

谢谢!

3 个答案:

答案 0 :(得分:3)

如果您的主要目标是过滤敏感数据,请阅读Hiding Sensitive Data from Logs with Python。您可以实现AnyObject以防止记录某些记录,也可以实现logging.Filter以使用正则表达式仅减少特定记录的部分。

要将过滤器和格式化程序类应用于所有记录器,请在dict配置中对其进行定义,并将其添加到您拥有的所有处理程序中。另外,请考虑通过设置loggingFormatter删除所有未描述的处理程序。请参阅Django logging docs中的自定义格式化程序和过滤器示例。

答案 1 :(得分:2)

信不信由你,您可以访问那些基础项目的记录器!因为您在django中,所以在实例化这些基础项目的记录器之前,可以加载您的设置,并可以初始化日志记录。

这是一个两步过程。第一步是确定记录器,该记录器是您要禁止显示的消息的来源。为此,请将name添加到my_formatter

    "formatters": {
        "my_formatter": {
            "format": "[%(asctime)s] [%(name)s] %(message)s",
            "datefmt": "%d/%b/%Y %H:%M:%S",
        },
    },

找到名称后,就可以定义过滤器了。

import logging


class AwesomeFilter(logging.Filter):
    def filter(self, rec):
        if 'sensitive' in rec.msg:
            return 0
        # you may need to filter based on `getMessage()` if
        # you can't find the information in the pre-formatted msg field
        return 1

现在,既然您知道产生不良消息的记录器的名称,我们就可以将AwesomeFilter附加到记录器:

LOGGING_CONFIG = None
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "my_formatter": {
            "format": "[%(asctime)s] [%(name)s] %(message)s",
            "datefmt": "%d/%b/%Y %H:%M:%S",
        },
    },
    "handlers": {
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",
            "formatter": "my_formatter",
        },
    },
    "loggers": {
        "my_logger": {
            "handlers": ["console"],
            "level": "DEBUG"
        },
        "name_of_logger_producing_bad_messages": {
            "filters": [ "app.filters.AwesomeFilter", ],
        },
    },
}

logging.config.dictConfig(LOGGING)

我们使用查找记录器名称的技巧来经常控制第三方库的记录输出。祝你好运!

答案 2 :(得分:1)

如果要将相同的日志记录配置传播给项目中的所有工作人员,我建议在utils中创建一个记录器文件,然后将其导入所有地方以使用它,而不是import logging

如果要确保您的配置与other handlers不冲突,可以执行以下操作

文件utils / log.py

import logging
import os

root = logging.getLogger()
if root.handlers:
    for handler in root.handlers:
        root.removeHandler(handler)]
LOGGING_CONFIG=[your config]
logging.config.dictConfig(LOGGING_CONFIG)
logger = logging.getLogger()

然后只需将此记录器导入所有工作人员中,而不是将其记录在库中

from utils.log import logger

logger.info("Hello world")