首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Structlog JSON

Python Structlog JSON
EN

Stack Overflow用户
提问于 2021-01-26 04:15:42
回答 2查看 1.2K关注 0票数 1

我目前正在使用python 结构日志 JSONRenderer,并希望更改日志配置,将事件呈现为第一个JSON属性,以获得更好的可读性。

目前的配置:

代码语言:javascript
复制
structlog.configure(processors=[structlog.processors.JSONRenderer()])
log = structlog.get_logger()

当前日志呼叫站点:

代码语言:javascript
复制
log.msg("Response: ",
                        content_type=content_type,
                        content_length=resp.headers.get('content-length'),
                        status_code=resp.status_code
                )

当前产出:

代码语言:javascript
复制
{"content_type": "application/json", "content_length": null, "status_code": 200, "event": "Response: "}

期望产出:

代码语言:javascript
复制
{"event": "Response: ", "content_type": "application/json", "content_length": null, "status_code": 200}

如能提供任何协助,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-26 04:59:47

除非您指定了另一个可调用的,否则structlog.processors.JSONRenderer只是将日志对象传递给json.dumps

代码语言:javascript
复制
structlog.configure(processors=[structlog.processors.JSONRenderer(serializer=mydumps)])

然后,mydumps将是一个函数,它执行json.dumps所做的工作,但将event放在第一位。这看起来可能是:

代码语言:javascript
复制
def mydumps(dic,**kw):
   mod = {}
   if 'event' in dic:
      mod["event"] = dic["event"]
   for k in dic:
      if k!="event":
         mod[k] = dic[k]
   return json.dumps(mod,**kw)

它所做的是创建一个新对象,然后在输入对象中查找event键,并将其首先放入新对象,然后继续将其余的键放入对象中,并将其与**kw一起传递给json.dumps

请注意,这样您就不需要事先指定日志可能有哪些其他键(比如内容类型),因为任何事件类型都可能有不同的信息。

票数 2
EN

Stack Overflow用户

发布于 2021-01-26 05:00:12

看起来,您可能使用的是比3.6更早的python版本,它保持按插入顺序排列的键。您可以使用KeyValueRenderer设置键顺序,并使用OrderedDict作为context_class:

代码语言:javascript
复制
from collections import OrderedDict

structlog.configure(
    processors=[
        structlog.processors.KeyValueRenderer(
            key_order=["event", "content_type", "content_length", "status_code"]
        ),
        structlog.processors.JSONRenderer()
    ],
    context_class = OrderedDict
)
log = structlog.get_logger()

参考资料:KeyValueRenderer

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

https://stackoverflow.com/questions/65895822

复制
相关文章

相似问题

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