繁体   English   中英

如何使用 structlog 获取多个独立的记录器

[英]How to get multiple independent loggers using structlog

我正在拼命寻找以下问题的解决方案:对于一个项目,我需要多个独立的记录器,比如说一个用于记录用户到控制台(stderr)的可读进度,一个用于将一些统计信息收集到 json 输出文件中。 我正在使用 structlog,下面的示例显示了问题

import structlog

logger1 = structlog.get_logger()
logger1.info('make something that needs to be logged', x=1, y=2, z='abc')

logger2 = structlog.get_logger()
structlog.configure(processors=[structlog.processors.JSONRenderer()])
logger2.info('structured_output', a=[1, 2, 3], b={'a': 1})

logger1.info('now this one is also json but it shouldn\'t')

给出输出

2022-06-08 08:30.34 [info     ] make something that needs to be logged x=1 y=2 z=abc
{"a": [1, 2, 3], "b": {"a": 1}, "event": "structured_output"}
{"event": "now this one is also json but it shouldn't"}

logger1 工作正常,直到我为 json 渲染应用配置。

我想看到的是

2022-06-08 08:30.34 [info     ] make something that needs to be logged x=1 y=2 z=abc
{"a": [1, 2, 3], "b": {"a": 1}, "event": "structured_output"}
2022-06-08 08:39.41 [info     ] still no json output, great!

如何保持两个记录器分开,以便 logger1 的配置保持不变?

谢谢! 最大限度

这有点复杂,但可以使用 structlog 最强大的标准库集成策略,其中每个日志条目都通过标准库,并允许您将标准库用于:

  1. 多路复用
  2. 按记录器名称路由日志条目。

上面链接的底部演示了多路复用,并举例说明了如何在终端中将彩色日志和普通日志放入文件中。

现在缺少的是根据记录器的名称在它们之间进行调度。 您可以执行类似structlog.[stdlib.]get_logger("json-only")的操作,将其设置为使用记录器名称的众所周知的名称,然后可以在标准库日志记录配置中引用。

它不像我希望的那样直截了当,但文档中的示例应该提供一个很好的起点。

没关系,我把事情复杂化了......我将 structlog 日志记录保留在控制台中,并编写了一个小的自定义 json-report 类来解决问题。 不过感谢您的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM