Loguru日志如何实现敏感数据脱敏处理
Loguru实现日志敏感数据脱敏的方案
Loguru无需仿照原生logging自定义Formatter/Handler,也不需要用自带的Filter(会直接删除整条日志),可通过以下两种方案实现仅替换敏感内容的脱敏效果:
方案1:自定义格式化函数(简单场景推荐)
直接在handler的format参数中传入自定义处理逻辑,在日志格式化后做脱敏替换:
from loguru import logger import re import sys def desensitize(text: str) -> str: # 可根据需求扩展更多正则匹配规则,比如手机号、身份证、密钥等 text = re.sub(r"pass: .*?", "pass: xxx", text) return text # 移除Loguru默认自带的handler logger.remove() # 添加自定义输出handler logger.add( sink=sys.stdout, level="INFO", # 先按规则格式化日志,再传入脱敏函数处理 format=lambda record: desensitize(f"{record['time']:%Y-%m-%d %H:%M:%S} | {record['level']} | {record['message']}\n") ) # 测试 logger.info("This is a demo and here is the pass: secret")
执行输出结果:2024-xx-xx xx:xx:xx | INFO | This is a demo and here is the pass: xxx
方案2:使用patcher修改日志记录(复杂场景推荐)
如果需要处理日志extra字段、或者在格式化前就修改消息内容,可使用Loguru的patcher能力:
from loguru import logger import re import sys def desensitize_patcher(record): # 脱敏消息内容 record["message"] = re.sub(r"pass: .*?", "pass: xxx", record["message"]) # 可额外处理extra中存储的敏感数据,举例: # if "phone" in record["extra"]: # record["extra"]["phone"] = re.sub(r"1\d{10}", "1*******", record["extra"]["phone"]) # 移除默认handler logger.remove() # 注册patcher,所有日志都会先经过该函数处理 logger = logger.patch(desensitize_patcher) # 添加输出handler logger.add( sink=sys.stdout, level="INFO", format="{time:%Y-%m-%d %H:%M:%S} | {level} | {message}" ) # 测试 logger.info("This is a demo and here is the pass: secret")
两种方案都可以实现和原生logging一致的脱敏效果,不会删除整条日志,仅替换敏感字段内容。
内容的提问来源于stack exchange,提问作者HeyMan
相关产品推荐
相关产品推荐

