首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在纯控制台模式下使用structlog解排key:value对?

如何在纯控制台模式下使用structlog解排key:value对?
EN

Stack Overflow用户
提问于 2020-05-04 15:27:07
回答 1查看 99关注 0票数 0

我在Django中使用structlog,注意到在控制台模式下key:value对的输出是按字母顺序排列的,这意味着当我绑定一个像log.bind('_id'=id)这样以_开头的新密钥时,它会被添加到第一个密钥中。

我之所以问这个问题,是因为在行的中间或开头插入了一个新的key:value对之后,在读取控制台时就失去了良好结构和彩色日志的好处。

文档提到了一个处理器布尔参数sort_keys,但是key_value格式化程序不支持它。如何在普通控制台中取消基于键:值对的排序?

这是我的配置:

代码语言:javascript
复制
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,
)
EN

回答 1

Stack Overflow用户

发布于 2020-05-06 11:42:56

Currently structlog.dev.ConsoleRenderer没有禁用键排序的选项。

原因是它是为人类设计的,当键/值对一直在改变它们的位置时,很难在日志中确定自己的方向。

在最坏的情况下,您必须为每个记录重新寻找一个键,而没有真正的指示它可能在哪里。有了字母顺序,你至少知道到哪里去搜索它。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61587120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档