对于以下代码:
logger.debug('message: {}'.format('test'))
pylint
产生以下警告:
日志-格式-插值(W1202):
在日志函数中使用%格式,并在日志语句的调用形式为“logging.(format_string.format(format_args…)”时将%参数作为参数传递。这样的调用应该改为使用%格式,但通过将参数作为参数传递,将插值留给日志函数。
我知道我可以关闭这个警告,但我想理解它。我假设使用格式()
是在Python 3中打印语句的首选方式。为什么记录器语句不是这样?
对于记录器语句来说,这是不正确的,因为它依赖于以前的“%”格式,比如字符串,使用给记录器调用的额外参数来提供这个字符串的延迟内插。例如,而不是做:
logger.error('oops caused by %s' % exc)
你应该这样做
logger.error('oops caused by %s', exc)
因此,只有当消息实际发出时,字符串才会被内插。
在使用时,您无法使用此功能。format()
。
根据日志记录
文档的优化部分:
消息参数的格式设置将延迟,直到无法避免为止。但是,计算传递给日志记录方法的参数也可能很昂贵,如果日志记录程序只是丢弃事件,您可能希望避免这样做。
也许这次差异可以帮助你。
下面的描述不是你问题的答案,但它可以帮助人们。
如果要使用fstrings(文本字符串插值)进行日志记录,则可以从中禁用它。pylintrc
文件,带有禁用=记录fstring插值
,请参阅:相关问题和评论。
您也可以禁用loging-formge-interpolation
。
在. pylintrc
文件中有3个记录样式选项:old
,new
,fstr
fstr
选项在2.4中添加,在2.5中删除
来自. pylintrc
文件(v2.4)的描述:
[LOGGING]
# Format style used to check logging format string. `old` means using %
# formatting, `new` is for `{}` formatting,and `fstr` is for f-strings.
logging-format-style=old
对于old(日志格式样式=old
):
foo = "bar"
self.logger.info("foo: %s", foo)
对于new(日志格式样式=new
):
foo = "bar"
self.logger.info("foo: {}", foo)
# OR
self.logger.info("foo: {foo}", foo=foo)
注意:您不能使用。format()
即使您选择了new
选项。
Pylint仍然对这段代码给出相同的警告:
self.logger.info("foo: {}".format(foo)) # W1202
# OR
self.logger.info("foo: {foo}".format(foo=foo)) # W1202
对于fstr(logging format style=fstr
):
foo = "bar"
self.logger.info(f"foo: {foo}")
就我个人而言,我更喜欢fstr选项,因为PEP-0498。
根据我的经验,延迟插值比优化(对于大多数用例)更有说服力的原因是它可以很好地与Sentry这样的日志聚合器配合使用。
考虑用户登录日志消息。如果将用户插入到格式字符串中,则不同的日志消息与用户一样多。如果像这样使用懒惰插值,日志聚合器可以更合理地将其解释为具有一堆不同实例的相同日志消息。