首页 > 解决方案 > 无法弄清楚如何在使用 structlog 写入磁盘时关闭彩色日志记录

问题描述

我刚刚开始学习如何使用structlog,我很难弄清楚如何在写入文件时关闭彩色日志记录。本质上,我所做的是将与标准日志记录模块一起使用的旧代码转换为与 structlog 一起使用 - 这就是我想出的:

formatter = logging.Formatter(
    fmt=LOGGER_OUTPUT_FORMAT,
    datefmt=LOGGER_DATETIME_FORMAT,
    )
handler = logging.StreamHandler()
handler.setLevel(level)
handler.setFormatter(formatter)
logger.addHandler(handler)

# create a file handler
formatter = logging.Formatter(
    fmt=LOGGER_OUTPUT_FORMAT,
    datefmt=LOGGER_DATETIME_FORMAT,
    )
handler = RotatingFileHandler(
    filename=LOGFILE_PATH,
    maxBytes=4000000,
    backupCount=20,
    )
handler.setLevel(level)
handler.setFormatter(formatter)
logger.addHandler(handler)

structlog.configure(logger_factory=LoggerFactory())
logger = structlog.getLogger('output_logger')

我不知道该怎么做是在哪里插入行以更改格式化程序,以便在将日志记录输出保存到文件时不使用彩色输出。我猜我可以卸载colorama,但这似乎违背了实际学习如何使用 structlog 的目的。我已经仔细研究了 structlog 手册,但这对我来说没有意义,而且我似乎尝试的一切都会引发错误,所以任何指导都将不胜感激!

标签: structlog

解决方案


根据您想要实现的确切目标,您必须将更多配置添加到structlog.configure.

如果您希望 stdlib 日志记录和 structlog 合作,请查看https://www.structlog.org/en/stable/standard-library.html


如果您只想使用 structlog 的原生记录器而不使用颜色,您现在只需要调整您的处理器。

正如入门教程所说,默认值为

[
    structlog.processors.StackInfoRenderer(),
    structlog.dev.set_exc_info,
    structlog.processors.format_exc_info,
    structlog.processors.TimeStamper(),
    structlog.dev.ConsoleRenderer()
]

如果 colorama 存在,那是五颜六色的。最简单的更改是将其更改为

[
    structlog.processors.StackInfoRenderer(),
    structlog.dev.set_exc_info,
    structlog.processors.format_exc_info,
    structlog.processors.TimeStamper(),
    structlog.dev.ConsoleRenderer(colors=False)
]

尽管生产代码可能应该使用structlog.processors.KeyValueRendererstructlog.processors.JSONRenderer,因为 ConsoleRenderer 已针对...控制台中的人类消费进行了优化。:)

请注意,API 文档中的颜色默认值目前是错误的,因为它实际上是基于 colorama 的存在,而在构建文档时 colorama 不存在。


推荐阅读