使用日志模块选择性记录请求

1 投票
2 回答
1330 浏览
提问于 2025-04-18 02:55

所有的请求和响应都会在一个网络框架中被记录下来,但它在记录时(使用日志模块)也会把密码记录进去(因为密码在登录请求中)。

我能否选择性地把密码或其他不想打印的字段显示为'XXXXXXX'?

在authentication.py文件中

import logging
from logging import config
logging.config.dictConfig({'version': 1, 'delete_existing_loggers': False, 'handlers': '.....'})

LOGGER = logging.getLogger(__name__)

##code to get variables from http request packet (like method, parameters)(for example, methods, params can be: [authentication.login, username, password], [authentication.change_password, username, old_password, new_password], [authentication.generate_validation_code, username]),
LOGGER.info('method %s with %s parameters called', method, params)

所以在这里,我希望对于特定的方法,有些变量应该显示为'xxxxx',而不是原来的值,特别是如果这个方法是'authentication.login',我想在参数中把第二个参数打印为'xxxx'。

谢谢。

2 个回答

0

除了Christian提供的解决方案,如果在dictConfig或fileConfig中传入了处理器,那么处理器的类应该进行子类化,并且需要添加过滤器。

代码来自以下网页: http://streamhacker.com/2010/04/08/python-logging-filters/

class InfoFilter(logging.Filter):
def filter(self, rec):
    return rec.levelno == logging.INFO

class InfoHandler(logging.StreamHandler):
def __init__(self, *args, **kwargs):
    StreamHandler.__init__(self, *args, **kwargs)
    self.addFilter(InfoFilter())

另外,如果想要更改记录的arg字段,就必须把它放进一个列表中,然后进行修改,最后再把它重新赋值回去。

2

是的,这个是可以做到的。你可以看看 logging.Filter。你需要创建一个这个类的子类,然后把它注册到你的日志记录器里。

举个例子:

class PasswordLoggingFilter(logging.Filter):
    def filter(self, record):
        # Modify record, especially record.msg and/or record.args.
        if want_to_keep_record:
            return True
        else:
            return False

logger.addFilter(PasswordLoggingFilter())

关于 record 对象的详细信息,可以在这里找到 文档

撰写回答