如何在普通控制台模式下使用structlog取消键:值对的排序?

2024-06-02 07:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我将structlog与Django一起使用,并注意到key:value对输出在控制台模式下是按字母顺序排列的,这意味着当我绑定一个类似_的新键时,它会在第一个位置添加

我问这个问题是因为在一个新的^ {< CD2>}插入到中间或开始的时候,当读取控制台时,一个结构和颜色都很好的日志的好处就消失了。p>

文档中提到了处理器布尔参数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,
)

Tags: keyjsonfalsevalueformatterhandlerslinelevel
1条回答
网友
1楼 · 发布于 2024-06-02 07:25:38

Currentlystructlog.dev.ConsoleRenderer没有禁用密钥排序的选项

原因是,这是为人类设计的,当键/值对一直在改变位置时,在日志中确定自己的方向会更加困难

在最坏的情况下,你必须为每一条记录重新寻找一个键,而没有真正的迹象表明它可能在哪里。按照字母顺序,你至少知道在哪里搜索它

我知道在最后有一些新的键会更好,但最终这将意味着每一个键都有可能一直跳舞

相关问题 更多 >