Python 使用日志记录模块有选择地记录请求

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

所有请求和响应都记录在web框架中,但它也记录在密码中(使用日志模块)(因为密码在登录请求中)

我是否可以有选择地打印“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'


谢谢。

是的,这是可能的。请看下面的图片。您需要对它进行子类化,然后向记录器注册它

例如:

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())