首页 > 解决方案 > Python记录新样式格式字符串

问题描述

我正在使用包含日志库的 Python 3.8.8。为了在 Python 中有一个通用的字符串格式,我还想用{}. 我还想对日志字符串使用惰性求值(所以 no "{}".format(var)or f"{var}")。

根据this Stack Overflow post about pylint(所以 pylint logging-format-style=new),以下变体应该可以工作。但是,有一个例外logging.info

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()

var1 = "foo"
var2 = "blub"

logger.info("var1 {}, var2 {}", var1, var2) # Exception thrown!

最后一行的异常如下:

--- Logging error ---
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/logging/__init__.py", line 1081, in emit
    msg = self.format(record)
  File "/usr/local/lib/python3.8/logging/__init__.py", line 925, in format
    return fmt.format(record)
  File "/usr/local/lib/python3.8/logging/__init__.py", line 664, in format
    record.message = record.getMessage()
  File "/usr/local/lib/python3.8/logging/__init__.py", line 369, in getMessage
    msg = msg % self.args
TypeError: not all arguments converted during string formatting

我从异常消息中推断出,日志记录仍然需要使用%s.

如何在{}使用任何其他包装函数的情况下使用新的格式字符串变体登录 Python 3.8.8 (正如 Stack Overflow 上的其他一些帖子所建议的那样)?虽然可以在 pylint 中定义,但如果没有任何包装函数,这可能是不可能的吗?

标签: python-3.xpython-logging

解决方案


我认为 Python 字符串插值更容易使用:

logger.info(f"var1 {var1}, var2 {var2}") 

实现惰性求值

if logger.isEnabledFor(logging.INFO):
    logger.info(f"var1 {var1}, var2 {var2}") 

推荐阅读