对于以下代码:
logger.debug('message: {}'.format('test'))
Pylint产生以下警告:
logging-format-interpolation (W1202):
在日志函数中使用%格式,并将%参数传递为
当日志语句的调用形式为
“日志记录。(format_string.format (format_args…)”。这样的
调用应该使用%格式,而将插值留给
日志函数,通过将参数作为参数传递。
我知道我可以关闭这个警告,但我想了解它。我假设使用format()是Python 3中输出语句的首选方式。为什么记录器语句不是这样?
下面是一个例子,说明为什么在日志记录中使用%s而不是f-strings更好。
>>> import logging
>>> logging.basicConfig(level=logging.INFO)
>>> logger = logging.getLogger('MyLogger')
>>>
>>> class MyClass:
... def __init__(self, name: str) -> None:
... self._name = name
... def __str__(self) -> str:
... print('GENERATING STRING')
... return self._name
...
>>> c = MyClass('foo')
>>> logger.debug('Created: %s', c)
>>> logger.debug(f'Created: {c}')
GENERATING STRING
受Python 3.7日志的启发:f-strings vs %。
下面是一个例子,说明为什么在日志记录中使用%s而不是f-strings更好。
>>> import logging
>>> logging.basicConfig(level=logging.INFO)
>>> logger = logging.getLogger('MyLogger')
>>>
>>> class MyClass:
... def __init__(self, name: str) -> None:
... self._name = name
... def __str__(self) -> str:
... print('GENERATING STRING')
... return self._name
...
>>> c = MyClass('foo')
>>> logger.debug('Created: %s', c)
>>> logger.debug(f'Created: {c}')
GENERATING STRING
受Python 3.7日志的启发:f-strings vs %。
“logging-format-interpolation (W1202)”是pylint的另一个错误建议(就像pep8中的许多建议一样)。
f字符串被描述为慢vs %,但你检查过吗?
使用f-string对% ->进行500_000旋转记录f-string:23.01秒,%:25.43秒。
所以使用f-string记录日志比%快。
当你看日志源代码:log.error() -> self.logger._log() -> self.makeRecord() -> self._logRecordFactory() ->类LogRecord() -> home made等效于format()
代码:
import logging
import random
import time
loops = 500_000
r_fstr = 0.0
r_format = 0.0
def test_fstr():
global loops, r_fstr
for i in range(0, loops):
r1 = time.time()
logging.error(f'test {random.randint(0, 1000)}')
r2 = time.time()
r_fstr += r2 - r1
def test_format():
global loops, r_format
for i in range(0 ,loops):
r1 = time.time()
logging.error('test %d', random.randint(0, 1000))
r2 = time.time()
r_format += r2 - r1
test_fstr()
test_format()
print(f'Logging f-string:{round(r_fstr,2)} sec. , %:{round(r_format,2)} sec.')