python - 如何在普通控制台模式下使用 structlog 对键:值对进行排序?
问题描述
我structlog
与 Django 一起使用,并注意到key:value
在控制台模式下对输出是按字母顺序排列的,这意味着当我绑定一个以_
like开头的新键时,log.bind('_id'=id)
它会首先添加。
我问这个问题是因为在key:value
中间或行首插入新的一对后,阅读控制台时,结构良好且彩色的日志的好处就消失了。
该文档提到了一个处理器布尔参数sort_keys
,但key_value
格式化程序不支持它。如何在普通控制台中取消排序键:值对?
这是我的配置:
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"json_formatter": {
"()": structlog.stdlib.ProcessorFormatter,
"processor": structlog.processors.JSONRenderer(sort_keys=False),
},
"plain_console": {
"()": structlog.stdlib.ProcessorFormatter,
"processor": structlog.dev.ConsoleRenderer(pad_event=43,
colors=True,
force_colors=True
),
},
"key_value": {
"()": structlog.stdlib.ProcessorFormatter,
"processor": structlog.processors.KeyValueRenderer(
key_order=['timestamp', 'level', 'logger', 'event'],
sort_keys=False
),
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "plain_console",
},
"json_file": {
"class": "logging.handlers.WatchedFileHandler",
"filename": "json.log",
"formatter": "json_formatter",
},
"flat_line_file": {
"class": "logging.handlers.WatchedFileHandler",
"filename": "flat_line.log",
"formatter": "key_value",
},
},
"loggers": {
'': {
"handlers": ["console", "flat_line_file", "json_file"],
"level": "WARNING",
'propagate': False,
},
'app1': {
"handlers": ["console", "flat_line_file", "json_file"],
"level": "INFO",
'propagate': False,
},
'app2': {
"handlers": ["console", "flat_line_file", "json_file"],
"level": "INFO",
'propagate': False,
},
'app3': {
"handlers": ["console", "flat_line_file", "json_file"],
"level": "INFO",
'propagate': False,
}
}
}
structlog.configure(
processors=[
structlog.stdlib.filter_by_level,
structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S.%f"), # (fmt="iso"),
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.stdlib.PositionalArgumentsFormatter(),
structlog.processors.StackInfoRenderer(),
structlog.processors.format_exc_info,
structlog.processors.UnicodeDecoder(),
structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
],
context_class=structlog.threadlocal.wrap_dict(dict),
logger_factory=structlog.stdlib.LoggerFactory(),
wrapper_class=structlog.stdlib.BoundLogger,
cache_logger_on_first_use=True,
)
解决方案
目前 structlog.dev.ConsoleRenderer
没有禁用键排序的选项。
原因是它是针对人类的,当键/值对一直在改变它们的位置时,很难在日志中定位自己。
在最坏的情况下,您必须为每条记录重新寻找一个关键,而没有真正的指示它可能在哪里。使用字母顺序,您至少知道在哪里搜索它。
我知道最后有某些新键会更好,但最终这意味着每个键都可能一直在跳舞。
推荐阅读
- python - Unable to scrape data from Website with Python
- google-cloud-vertex-ai - 发送 http 请求 Google Vertex AI 端点
- javascript - 即使地址栏中的路由更改,React Router 也不会呈现视图
- apache - apache Remote_Host 未填充客户端的主机名
- ios - 列表以在 swiftUI 中显示来自服务器的数据
- google-cloud-platform - Google Cloud Platform - 未触发警报
- javascript - 显示嵌套数组的所有 slug
- multilevel-analysis - 使用 lapply() 或 mapply() 循环通过具有两个不同预测变量的 nlme::lme 函数
- javascript - onClick 功能在 React 组件中没有按预期工作
- c++ - 为什么我有一个无限循环?简单的问题,简短的代码