我使用 python 2.7.3 的日志记录工具。这个Python版本的文档说:
日志记录包早于较新的格式化选项,例如 str.format() 和 string.Template。支持这些较新的格式选项...
我喜欢带有花括号的“新”格式。所以我正在尝试做类似的事情:
log = logging.getLogger("some.logger")
log.debug("format this message {0}", 1)
并得到错误:
类型错误:在字符串格式化期间并非所有参数都被转换
我想念这里什么?
附:我不想使用
log.debug("format this message {0}".format(1))
因为在这种情况下,无论记录器级别如何,消息都会被格式化。
EDIT:看看StyleAdapter@Dunes 答案中的方法与这个答案不同;它允许在调用记录器的方法(debug()、info()、error() 等)时使用替代格式样式,而无需样板。
来自文档 -使用替代格式样式:
记录调用(logger.debug()、logger.info() 等)只需要
实际日志消息本身的位置参数,以及
关键字参数仅用于确定如何处理选项
实际的日志记录调用(例如 exc_info 关键字参数
指示应该记录回溯信息,或者额外的
关键字参数来指示附加上下文信息
添加到日志中)。所以你不能直接使用进行日志记录调用
str.format() 或 string.Template 语法,因为内部日志记录
包使用 %-formatting 来合并格式字符串和变量
论据。在保留落后的情况下不会改变这一点
兼容性,因为现有的所有日志记录调用
代码将使用 % 格式的字符串。
And:
但是,有一种方法可以使用 {}- 和 $- 格式来
构建您的个人日志消息。回想一下,对于一条消息,您
可以使用任意对象作为消息格式字符串,并且
日志记录包将在该对象上调用 str() 来获取实际的
格式字符串。
将此复制粘贴到wherever
module:
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)
Then:
from wherever import BraceMessage as __
log.debug(__('Message with {0} {name}', 2, name='placeholders'))
注意:实际格式化会延迟到需要时为止,例如,如果未记录 DEBUG 消息,则根本不会执行格式化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)