Python 使用日志记录模块有选择地记录请求
所有请求和响应都记录在web框架中,但它也记录在密码中(使用日志模块)(因为密码在登录请求中) 我是否可以有选择地打印“XXXXXXX”作为密码或任何其他我不想打印的字段 在authentication.py中Python 使用日志记录模块有选择地记录请求,python,python-2.7,Python,Python 2.7,所有请求和响应都记录在web框架中,但它也记录在密码中(使用日志模块)(因为密码在登录请求中) 我是否可以有选择地打印“XXXXXXX”作为密码或任何其他我不想打印的字段 在authentication.py中 import logging from logging import config logging.config.dictConfig({'version': 1, 'delete_existing_loggers': False, 'handlers': '.....'}) LOGG
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'
谢谢。是的,这是可能的。请看下面的图片。您需要对它进行子类化,然后向记录器注册它 例如:
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())
对于
记录
对象的详细信息,除了Christian提供的解决方案之外,如果处理程序是在dictConfig或fileConfig中传递的,则处理程序类应该是子类的,并且需要添加过滤器
代码取自以下网页:
此外,如果要更改记录的arg字段,必须将其放入列表中,然后进行更改并重新分配。在将数据传递给日志模块之前,最好在应用程序级别清理数据。当然,您可以编写一些自定义格式化程序来删除敏感信息,但这将很难维护,而且可能不会100%有效。请尝试使用POST而不是POST提交密码数据GET@SpoonMeiser这是在中间件上实现的,在从http请求中剥离变量后,在中间件上处理请求。那就不行了,我不明白。请你在问题中详细说明;向我们展示进行日志记录的代码、一些示例输出或其他内容?@Spoonmiser我已经用一些代码编辑了这个问题。您能告诉我们在logger.info(msg,a,b)中提供的参数(msg,a,b)在filter函数的record中是否可用吗?我已经试过了,当控件到达filter函数时,似乎没有其他参数(a,b)
record
函数的filter()
参数是类LogRecord
(.record.msg
包含原始消息字符串,record.args
包含参数。感谢它的工作。最初它不工作,因为在dictConfi中我传递了处理程序。
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())