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

OhM*_*Mad 8 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)
Run Code Online (Sandbox Code Playgroud)

真的,我的最终目标只是通过替换它们来防止某些东西出现在日志中——如果有其他方法可以做到这一点,请随时分享。

谢谢!

Yan*_*ann 5

如果您的主要目标是过滤敏感数据,请阅读使用 Python 从日志中隐藏敏感数据。您可以实施 alogging.Filter以防止记录某些记录,或实施 aloggingFormatter以使用正则表达式仅减少特定记录的部分。

要将过滤器和格式化程序类应用于所有记录器,请在字典配置中定义它们并将其添加到您拥有的所有处理程序中。另外,请考虑通过设置删除任何未描述的处理程序disable_existing_loggers': True请参阅Django 日志记录文档中的自定义格式化程序和过滤器示例。


SAR*_*A E 1

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

如果您想确保您的配置不与其他处理程序冲突,您可以执行以下操作

文件 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()
Run Code Online (Sandbox Code Playgroud)

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

from utils.log import logger

logger.info("Hello world")
Run Code Online (Sandbox Code Playgroud)