首页 > 解决方案 > 为什么每次我将列表添加为关键字 arg 时,python structlog 都会记录一个 redactError?

问题描述

我正在使用 python structlog 版本 19.1.0 ( https://www.structlog.org/en/19.1.0/index.html ),在以前的部署中,我使用了相同的版本并且没有收到任何 redactError 消息我的日志。但是现在,每当我将关键字 args 添加到日志消息时(特别是如果该值是一个列表),它也会记录一个 redactError。

我的代码:

logger = structlog.get_logger()
logger.debug("My custom event name", email_addresses=["some.email.address@mail.com"])

日志消息:

{"event":"My custom event name", "email_addresses":["some.email.address@mail.com"], "level":"info", "msg":"\u003cnil\u003e", "redactError":"1 error occurred:\n\t* error redacting item email_addresses: 1 error occurred:\n\t* error redacting item 0: unknown interface interface {} not redacted\n\n\n\n","request":"b8214486-d270-416b-ba3a-cc36b784c19d", "stream":"stderr", "thread":140500243846912, "time":"2020-07-22T19:28:50Z","timestamp":"2020-07-22T19:28:50.737388Z"}

我不知道为什么它redactError显然仍然能够在日志消息中添加关键字参数时给我一个。我还注意到,如果列表长于 1,则会在redactError字符串中添加更多错误(例如,每个索引的“错误编辑项 <>:未知接口接口 {} 未编辑\n”)。

我真的很困惑为什么我会收到这个错误。它并没有干扰我的代码执行能力,它只是真的把日志弄得一团糟。任何帮助表示赞赏!

编辑:感谢下面的一些评论。添加我的日志记录配置以防出现问题:

# setting up the logging config
level = getattr(logging, "DEBUG")
formatter = logging.Formatter("%(message)s")
sh = logging.StreamHandler()
sh.setFormatter(formatter)

logger = logging.getLogger()
logger.setLevel(level)
logger.addHandler(sh)

processors = [
    structlog.stdlib.filter_by_level,
    structlog.stdlib.add_log_level,
    structlog.stdlib.add_logger_name,
    structlog.processors.format_exc_info,
    structlog.processors.TimeStamper(fmt='iso', utc=True),
    structlog.processors.StackInfoRenderer(),
    add_thread,
    structlog.processors.JSONRenderer(),
]

structlog.configure(
    processors=processors,
    context_class=structlog.threadlocal.wrap_dict(dict),
    logger_factory=structlog.stdlib.LoggerFactory(),
    wrapper_class=structlog.stdlib.BoundLogger,
    cache_logger_on_first_use=True,
)

标签: pythonpython-3.xstructlog

解决方案


看来问题是 structlog.processors.JSONRenderer.... 当我更改structlog.processors.JSONRenderer()structlog.processors.KeyValueRenderer()时,redactError 不会发生。我不知道为什么 JSONRenderer 不喜欢列表,但也许其他人知道。


推荐阅读