我目前正在使用python 结构日志 JSONRenderer,并希望更改日志配置,将事件呈现为第一个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}如能提供任何协助,将不胜感激。
发布于 2021-01-26 04:59:47
除非您指定了另一个可调用的,否则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。
请注意,这样您就不需要事先指定日志可能有哪些其他键(比如内容类型),因为任何事件类型都可能有不同的信息。
发布于 2021-01-26 05:00:12
看起来,您可能使用的是比3.6更早的python版本,它保持按插入顺序排列的键。您可以使用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
https://stackoverflow.com/questions/65895822
复制相似问题