首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用structlog记录更改的对象属性

使用structlog记录更改的对象属性
EN

Stack Overflow用户
提问于 2020-04-29 22:47:08
回答 1查看 74关注 0票数 0

我最近发现了structlog,并希望使用它来记录一些对象的对象属性。我不确定两件事:

1)面向对象日志记录的最佳实践是什么?我能找到的关于对象的唯一示例是this one,其中logger被创建为全局变量,每个对象都创建一个新的记录器,并再次创建函数。(如果我理解正确的话。)

我必须在每次移动后重新绑定吗?多么?

这是我目前所拥有的:

代码语言:javascript
复制
import structlog
logger = structlog.get_logger()

class User:
  def __init__(self, id, pos):
    self.id = id
    self.pos = pos
    self._log = logger.bind(id=self.id, pos=str(self.pos))

  def move(self, delta):
    log = self._log.bind(delta=delta)
    self.pos += delta
    log.msg("User moved")

在这个面向对象的示例中,我是否正确/很好地使用了structlog?无论如何,这总是打印相同的位置,即使当用户移动。我想,我必须做log.msg("User moved", pos=str(self.pos))来更新上下文?但这只会更新函数中记录器的上下文。在其他函数中,位置仍然会被错误地记录。

EN

回答 1

Stack Overflow用户

发布于 2020-05-02 16:08:02

我个人倾向于只注销ID,但如果您想要更丰富的日志行,您可以将整个对象绑定到记录器,并编写一个简单的处理器来为您提取有趣的属性:

代码语言:javascript
复制
def user_extractor(_, __, ed):
    user = ed.pop("user", None)
    if user is not None:
        ed.update(user_id=user.id, user_pos=user.pos)

    return ed

一种更一般的选择是使用functools.singledispatch定义序列化,并编写一个使用它的处理器(也不应该超过几行)。我想我们迟早也会在structlog中添加对这一点的支持。

有关编写处理器的更多详细信息,请参阅http://www.structlog.org/en/stable/processors.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61504653

复制
相关文章

相似问题

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