以下是问题的快速再现:
>>> import logging
>>> logging.getLogger().setLevel(logging.INFO)
>>> from datetime import date
>>> date = date.today()
>>> logging.info('date={}', date)
Traceback (most recent call last):
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 846, in emit
msg = self.format(record)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 723, in format
return fmt.format(record)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 464, in format
record.message = record.getMessage()
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 328, in getMessage
msg = msg % self.args
TypeError: not all arguments converted during string formatting
Logged from file <stdin>, line 1
>>>
我该怎么做呢?
这实际上是Why do I get "TypeError: not all arguments converted during string formatting" trying to substitute a placeholder like {0} using %?的一个特例--但是因为实际的格式化步骤发生在用户代码之外,所以需要不同的解决方法。
4条答案
按热度按时间c3frrgcw1#
使用日志记录模块时不能使用新式格式;使用
%s
代替{}
。logging模块使用旧式的
%
操作符来格式化日志字符串。有关更多详细信息,请参阅debug
方法。如果你真的想使用
str.format()
字符串格式,请考虑使用自定义对象,在实际转换为字符串时应用格式“late”:这是Python 3
logging
模块文档提出的一种方法,它碰巧也适用于Python 2。yqhsw0fo2#
你可以自己格式化:
正如Martijn Pieters所指出的,这将始终运行字符串格式化,而使用日志记录模块将导致格式化仅在实际记录消息时执行。
kupeojn63#
Martijn的回答是正确的,但是如果您更喜欢在日志记录中使用新样式的格式,可以通过子类化Logger来实现。
然后只需要设置logging类:
ee7vknir4#
你也可以这样做(Python 3);