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
键并将其首先放入新对象然后继续将其余键放入对象并将其与**kw
到 json.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()
我目前正在使用 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
键并将其首先放入新对象然后继续将其余键放入对象并将其与**kw
到 json.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()