我将记录工具用于python 2.7.3。此Python版本的文档说:
日志记录包会早于较新的格式设置选项,例如str.format()和string.Template。这些更新的格式选项受支持…
我喜欢大括号的“新”格式。所以我正在尝试做类似的事情:
log = logging.getLogger("some.logger") log.debug("format this message {0}", 1)
并得到错误:
TypeError:并非在字符串格式化期间转换了所有参数
我在这里想念什么?
PS我不想使用
log.debug("format this message {0}".format(1))
因为在这种情况下,无论记录器级别如何,消息总是被格式化。
编辑: 与这个答案不同,看看StyleAdapter@Dunes答案中的方法;它允许在调用记录器的方法(debug(),info(),error()等)时使用其他格式样式而无需样板。
StyleAdapter
更简单的解决方案是使用出色的logbook模块
import logbook import sys logbook.StreamHandler(sys.stdout).push_application() logbook.debug('Format this message {k}', k=1)
或更完整的:
>>> import logbook >>> import sys >>> logbook.StreamHandler(sys.stdout).push_application() >>> log = logbook.Logger('MyLog') >>> log.debug('Format this message {k}', k=1) [2017-05-06 21:46:52.578329] DEBUG: MyLog: Format this message 1
来自文档-使用其他格式样式:
记录调用(logger.debug(),logger.info()等)仅采用实际记录消息本身的位置参数,而关键字参数仅用于确定如何处理实际记录调用的选项(例如exc_info关键字参数)表示应该记录回溯信息,或extra关键字参数指示要添加到日志的其他上下文信息。因此,您不能使用str.format()或string.Template语法直接进行日志记录调用,因为日志记录包在内部使用%-formatting来合并格式字符串和变量参数。在保留向后兼容性的同时,不会进行任何更改,因为现有代码中存在的所有日志记录调用都将使用%格式的字符串。
和:
但是,有一种方法可以使用{}-和$-格式构造您的单个日志消息。回想一下,对于一条消息,您可以使用任意对象作为消息格式字符串,并且日志记录程序包将对该对象调用str()以获取实际的格式字符串。
复制粘贴到wherever模块:
wherever
class BraceMessage(object): def __init__(self, fmt, *args, **kwargs): self.fmt = fmt self.args = args self.kwargs = kwargs def __str__(self): return self.fmt.format(*self.args, **self.kwargs)
然后:
from wherever import BraceMessage as __ log.debug(__('Message with {0} {name}', 2, name='placeholders'))
注意:实际格式化会延迟到必要时才进行,例如,如果未记录DEBUG消息,则根本不会执行格式化。