我最近发现了structlog,并希望使用它来记录一些对象的对象属性。我不确定两件事:
1)面向对象日志记录的最佳实践是什么?我能找到的关于对象的唯一示例是this one,其中logger被创建为全局变量,每个对象都创建一个新的记录器,并再次创建函数。(如果我理解正确的话。)
我必须在每次移动后重新绑定吗?多么?
这是我目前所拥有的:
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))来更新上下文?但这只会更新函数中记录器的上下文。在其他函数中,位置仍然会被错误地记录。
发布于 2020-05-02 16:08:02
我个人倾向于只注销ID,但如果您想要更丰富的日志行,您可以将整个对象绑定到记录器,并编写一个简单的处理器来为您提取有趣的属性:
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。
https://stackoverflow.com/questions/61504653
复制相似问题