如何使用string.format而不是字符串格式化器来使用记录器

时间:2015-03-19 23:08:16

标签: python string python-2.7 logging string-formatting

现在我有很多使用传统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,但这意味着重写函数调用(然后更改使用此函数的所有代码)。

有没有办法让日志记录模块接受这些?或者我自己只做我的所有格式化?

0 个答案:

没有答案