使用日志模块选择性记录请求
所有的请求和响应都会在一个网络框架中被记录下来,但它在记录时(使用日志模块)也会把密码记录进去(因为密码在登录请求中)。
我能否选择性地把密码或其他不想打印的字段显示为'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
对象的详细信息,可以在这里找到 文档。