现在我有很多使用传统C风格字符串格式化程序的代码,即
print "Hi, %s" % name
我们正致力于过渡到使用string.format()
,即
print "Hi, {}".format(name)
但是我们遇到了日志问题。例如,请考虑以下示例。
import logging
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.error("hi %s", "1")
logger.error("hi {}", "2")
我希望日志记录模块可以使其中任何一个工作,但是我得到以下输出到stderr
$ python example.py
ERROR:__main__:hi 1
Traceback (most recent call last):
File "C:\Python27\lib\logging\__init__.py", line 859, in emit
msg = self.format(record)
File "C:\Python27\lib\logging\__init__.py", line 732, in format
return fmt.format(record)
File "C:\Python27\lib\logging\__init__.py", line 471, in format
record.message = record.getMessage()
File "C:\Python27\lib\logging\__init__.py", line 335, in getMessage
msg = msg % self.args
TypeError: not all arguments converted during string formatting
Logged from file example.py, line 6
ERROR:__main__:hi
现在我们可以通过回溯到C风格的字符串来改变所有涉及的字符串,但这非常难看,更糟糕,不一致。我们还可以在代码中添加一些额外的行,例如
def run_function(func, arg, err_msg, err_msg_params):
try:
func(arg)
except MyException as e:
logger.error(err_msg.format(err_msg_params))
logger.exception(e)
raise
但这看起来并不干净。我们也可以在调用此函数之前进行格式化,然后不要包含err_msg_params
,但这意味着重写函数调用(然后更改使用此函数的所有代码)。
有没有办法让日志记录模块接受这些?或者我自己只做我的所有格式化?