首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Loguru:如何混淆日志中的数据

Loguru:如何混淆日志中的数据
EN

Stack Overflow用户
提问于 2021-11-10 11:12:19
回答 2查看 652关注 0票数 1

使用python记录器,我可以混淆如下数据:

代码语言:javascript
复制
import logging
import re
import sys


class MySensitiveFormatter(logging.Formatter):
    """Formatter that removes sensitive information."""

    @staticmethod
    def _filter(s):
        """Remove credentials."""
        result = re.sub(r"pass: .*", "pass: xxx", s)
        return result

    def format(self, record):
        """Obfuscate sensitive information."""
        original = logging.Formatter.format(self, record)
        return self._filter(original)


stream_handler = logging.StreamHandler(stream=sys.stdout)
stream_handler.setFormatter(MySensitiveFormatter())
logger = logging.getLogger("demo")
logger.setLevel("INFO")
logger.addHandler(stream_handler)

logger.info("This is a demo and here is the pass: secret")

打印=>这是一个演示,下面是pass: xxx

在loguru中,我不能添加格式化程序/处理程序,并且过滤器可以删除整个记录(这不是我想要的)。如何使用loguru实现这一目标?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-12 09:39:49

这是loguru团队提供的正确方法:

代码语言:javascript
复制
def obfuscate_message(message: str):
    """Obfuscate sensitive information."""
    result = re.sub(r"pass: .*", "pass: xxx", s)
    return result

def formatter(record):
    record["extra"]["obfuscated_message"] = obfuscate_message(record["message"])
    return "[{level}] {extra[obfuscated_message]}\n{exception}"

logger.add(sys.stderr, format=formatter)

详情请参见loguru问题

票数 1
EN

Stack Overflow用户

发布于 2021-11-17 17:01:12

这就是它的工作原理:

代码语言:javascript
复制
def obfuscate_message(message: str):
    """Obfuscate sensitive information."""
    result = re.sub(r"pass: .*", "pass: xxx", s)
    return result


class LoguruInterceptHandler(logging.Handler):
    """Enable loguru logging."""

    def emit(self, record):
        """Get corresponding Loguru level if it exists."""
        try:
            level = loguru.logger.level(record.levelname).name
        except ValueError:
            level = record.levelno

        # Find caller from where originated the logged message
        frame, depth = logging.currentframe(), 2
        while frame.f_code.co_filename == logging.__file__:
            frame = frame.f_back
            depth += 1

        # filter sensitive data (this does the trick)
        message = obfuscate_message(record.getMessage())

        loguru.logger.opt(depth=depth, exception=record.exc_info).log(level, message)

像这样使用:

代码语言:javascript
复制
logger = logging.getLogger()
logger.handlers = [LoguruInterceptHandler()]  # overwrite old handlers
logger.info("This is a demo and here is the pass: secret")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69912271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档