Python 结构日志 JSON

Python Structlog JSON

我目前正在使用 python structlog JSON 渲染器并希望更改我的日志配置以将事件渲染为第一个 JSON 属性以提高可读性。

当前配置:

structlog.configure(processors=[structlog.processors.JSONRenderer()])
log = structlog.get_logger()

当前日志调用站点:

log.msg("Response: ",
                        content_type=content_type,
                        content_length=resp.headers.get('content-length'),
                        status_code=resp.status_code
                )

当前输出:

{"content_type": "application/json", "content_length": null, "status_code": 200, "event": "Response: "}

期望的输出:

{"event": "Response: ", "content_type": "application/json", "content_length": null, "status_code": 200}

如有任何帮助,我们将不胜感激。

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

structlog.configure(processors=[structlog.processors.JSONRenderer(serializer=mydumps)])

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

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 键并将其首先放入新对象然后继续将其余键放入对象并将其与**kwjson.dumps.

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

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

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