【发布时间】:2021-03-30 10:24:21
【问题描述】:
我有一个使用格式化程序的记录器,需要记录一条包含变量的消息。够正常的。如果我的记录器没有使用格式化程序,一切都很好。如果是这样,它突然不知道如何进行格式字符串扩展了。这很奇怪。
如果我有这个:
import logging
import sys
logger = logging.getLogger("test_logger")
normal_handler = logging.StreamHandler(sys.stdout)
formatted_handler = logging.FileHandler("testlog.txt")
logger.setLevel(logging.DEBUG)
normal_handler.setLevel(logging.DEBUG)
formatted_handler.setLevel(logging.DEBUG)
record_format = "(%(asctime)s %(module)s %(funcName)s) %(msg)s"
timestamp_format = "[%Y-%m-%d %H:%M:%S]"
formatter = logging.Formatter(fmt=record_format, datefmt=timestamp_format)
formatted_handler.setFormatter(formatter)
logger.addHandler(normal_handler)
logger.addHandler(formatted_handler)
test_var = "bar"
logger.info("foo %s", test_var)
...然后在标准输出上我得到预期的输出:foo bar
...但是在使用格式化程序的日志文件中我得到:([2021-03-30 11:20:29] <stdin> <module>) foo %s
我知道格式化程序带有样式参数,但是a)我不能使用它,因为我也必须支持python 2,并且b)即使我确实使用了它,python 2 也有同样的问题,所以无论如何它都无法解决问题。我可以在将日志消息发送到记录器之前对其进行预格式化,但我认为这是不鼓励的(当然 pylint 会抱怨它,我真的不想禁用 pylint 警告而不是解决问题)。
请问我错过了什么?
【问题讨论】:
标签: python logging formatting