问题:PyLint消息:日志记录格式插值
对于以下代码:
logger.debug('message: {}'.format('test'))
pylint
产生以下警告:
日志记录格式插值(W1202):
在日志记录函数中使用%格式,并将%参数作为参数传递。在日志记录语句的调用形式为“ logging。(format_string.format(format_args …))”时使用。此类调用应改为使用%格式,但通过将参数作为参数传递,将插值留给日志记录函数。
我知道我可以关闭此警告,但我想理解它。我假定使用format()
是在Python 3中打印语句的首选方法。为什么这对于logger语句不是正确的?
回答 0
logger语句不是正确的,因为它依赖于以前的“%”格式(例如字符串)来使用给logger调用提供的额外参数来对该字符串进行延迟插值。例如,而不是做:
logger.error('oops caused by %s' % exc)
你应该做
logger.error('oops caused by %s', exc)
因此,仅当实际发出消息时才对字符串进行插值。
使用时,您将无法利用此功能.format()
。
根据文档的“ 优化”部分logging
:
消息参数的格式将推迟到无法避免为止。但是,计算传递给日志记录方法的参数也可能很昂贵,并且如果记录器将只是丢弃您的事件,则可能要避免这样做。
回答 1
也许这段时间的差异可以帮助您。
以下描述不是您问题的答案,但可以帮助人们。
对于pylint的2.4:对于中记录样式3个选择.pylintrc
文件:old
,new
,fstr
.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
对于旧的(logging-format-style=old
):
foo = "bar"
self.logger.info("foo: %s", foo)
对于新(logging-format-style=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}")
就个人而言,由于PEP-0498,我更喜欢fstr选项。
回答 2
以我的经验,对于惰性插值而言,比优化(对于大多数用例)更令人信服的原因是,它与Sentry之类的日志聚合器配合得很好。
考虑“用户已登录”日志消息。如果将用户插值到格式字符串中,则与用户一样多的不同日志消息。如果您像这样使用惰性插值,则日志聚合器可以更合理地将其解释为具有多个不同实例的同一条日志消息。