首页 > 解决方案 > Python 记录器过滤器在 msg %s 变量中不起作用

问题描述

嗨,我正在使用 python 日志记录,我想使用过滤器从控制台和调试文件中替换密码。但它只在某些情况下有效

import logging
import logging.config
from collections import defaultdict

class AwesomeFilter(logging.Filter):
    def filter(self, rec):
        if 'password' in rec:
            return "here is password, i hide this line"
        else:
            return 1

LOG_CONFIG = {
    'version': 1,
    'filters': {
        'file_filter': {
            '()': AwesomeFilter,
        },
    },
    'disable_existing_loggers': True,


    'formatters': {
        'standard': {
            'format': '%(asctime)s %(name)s [%(levelname)s]: %(message)s'
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'INFO',
            'formatter': 'standard',
            'filters': ['file_filter'],
        },
    },
    'loggers': {
        '': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
            'propagate': True
        },
    }
}

logging.config.dictConfig(LOG_CONFIG)

这行得通,如果我写了

log.info("line with my super password") - 在这里有效,并替换整行

但是如果我想使用

log.info ("returned line is %s") and in %s is string "here is password" 过滤器忽略这一行,因为:

<LogRecord: PGSQLDatabaseConnection, 20, dluznici.py, 172, "returned line is: %s">

所以,这里没有“密码”这个词……如何检查 %s 中的密码?

也许我也必须在这里定义过滤器?

class PGSQLDatabase:
    def __init__(self, conn_params, session_params):
        self.log = logging.getLogger('PGSQLDatabaseConnection')
        self.filter = ????????????


标签: pythonpython-3.xfilteryaml

解决方案


好的,我可以在过滤器中搜索 args :)


推荐阅读