使用'%'运算符可以在string formats中使用可选键吗? 我在Python 2.7中使用日志记录 API,因此我无法使用Advanced String Formatting。
我的问题如下:
>>> import logging
>>> FORMAT = '%(asctime)-15s %(message)s %(user)s'
>>> logging.basicConfig(format=FORMAT)
>>> logging.warning("It works for:", extra={'user': 'me'})
2016-08-29 11:24:31,262 It works for: me
>>> logging.warning("It does't work!")
Traceback (most recent call last):
...
KeyError: 'user'
Logged from file <input>, line 1
如果遗失,我想为用户设置一个空字符串。我怎么能这样做?
我尝试使用defaultdict,但失败了:
>>> import collections
>>> extra = collections.defaultdict(unicode)
>>> logging.warning("It does't work!", extra=extra)
Traceback (most recent call last):
...
KeyError: 'user'
Logged from file <input>, line 1
相比之下,使用Jinja2,我们可以做到:
>>> import jinja2
>>> jinja2.Template('name: {{ name }}, email: {{ email }}').render(name="me")
u'name: me, email: '
=&GT;这里没有例外,只是一个空字符串(用于“电子邮件”)。
答案 0 :(得分:1)
A)1.1.1.1
方法可以正常工作,但只有直接使用才能正常使用。
defaultdict
B)使用日志函数的>>> import collections
>>> dd=collections.defaultdict(str)
>>> dd['k'] = 22
>>> '%(k)s %(nn)s' % dd
'22 '
参数,如文档中所述,即不直接如上所示。这就是为什么使用extra
代替常规defaultdict
并没有什么区别。
第三个关键字参数是extra,可用于传递a 用于填充LogRecord的 dict 的字典 使用用户定义的属性为日志记录事件创建。
C)您可以使用日志记录过滤器来处理缺少的额外数据:
dict
任何使用import logging
class UserFilter:
def filter(self, record):
try:
record.user
except AttributeError:
record.user = '<N/A>'
return True
FORMAT = '%(asctime)-15s %(message)s %(user)s'
logging.basicConfig(format=FORMAT)
logging.getLogger().addFilter(UserFilter())
logging.warning("It works for:", extra={'user': 'me'})
logging.warning("It doesn't work!")
# DATE TIME It doesn't work! <N/A>
方法的课程都可以。它可以就地修改记录,并且必须返回filter
以接受记录,或True
将其过滤掉。