PyLint 메시지 : logging-format-interpolation


161

다음 코드의 경우 :

logger.debug('message: {}'.format('test'))

pylint 다음과 같은 경고가 발생합니다.

로깅 형식 보간 (W1202) :

로깅 함수에서 % 형식화를 사용하고 % 매개 변수를 인수로 전달 로깅 명령문에 "logging. (format_string.format (format_args ...))"의 호출 양식이있는 경우 사용됩니다. 이러한 호출은 대신 % 형식을 사용해야하지만 매개 변수를 인수로 전달하여 로깅 기능에 보간을 유지합니다.

이 경고를 해제 할 수 있지만 알고 싶습니다. 필자 format()는 파이썬 3에서 문장을 출력하기 위해 선호되는 방법을 사용한다고 가정 했습니다. 왜 이것이 로거 문장에 해당되지 않습니까?

답변:


203

로거 명령문은 로거 호출에 제공된 추가 인수를 사용하여이 문자열의 지연 보간을 제공하기 위해 문자열과 같은 이전 "%"형식을 사용하기 때문에 사실이 아닙니다. 예를 들어 대신 :

logger.error('oops caused by %s' % exc)

넌해야 해

logger.error('oops caused by %s', exc)

따라서 메시지가 실제로 생성 된 경우에만 문자열이 보간됩니다.

를 사용할 때는이 기능을 이용할 수 없습니다 .format().


문서 의 최적화 섹션에 따라 logging:

메시지 인수의 형식화는 피할 수 없을 때까지 지연됩니다. 그러나 로깅 메소드에 전달 된 인수를 계산하는 것도 비용이 많이들 수 있으며 로거가 이벤트를 버릴 경우이를 수행하지 않는 것이 좋습니다.


4
@pfnuesel, .format ()은 logger.error를 호출하기 전에 확장되는 반면 "lazy interpolation"은 필요한 경우에만 확장이 수행됨을 의미합니다 (예 : 메시지가 실제로 어딘가에 표시됨)
sthenault

10
이 게으른 평가가 선호되고 차이를 만드는 좋은 기준이 있습니까? PEP282 또는 로깅 라이브러리
culix

25
그러나 이것이 나중에 코드에 대한 유지 관리 문제가 있음을 의미합니까? 나중에 업그레이드 .format()하여 어떤 시점에서 스타일 로 이동하기 위해 pylint가 "추천"할 것 logging입니까? 최소한 대부분의 작업에서 최첨단 속도 성능보다 유지 관리에 더 관심이 있기 때문에 묻습니다.
Mike Williamson

3
@ MikeWilliamson : 부작용이있을 수 있기 때문에이 메시지는 경고라고 생각하지만 안전하게 무시할 수 있습니다.
saihtamtellim

5
경고의 동기는 대부분 성능과 관련이 있지만 (즉, 로그 문이 생성되지 않으면 보간 비용이 절약됩니다) 많은 (어쩌면 대부분의) 응용 프로그램에서 성능 비용이 무시할 만하다는 점은 주목할 가치가 있습니다. 참조 : github.com/PyCQA/pylint/issues/2395github.com/PyCQA/pylint/issues/2354
아담 파킨

23

어쩌면이 시간 차이는 당신을 도울 수 있습니다.

다음 설명은 귀하의 질문에 대한 답변이 아니지만 사람들에게 도움이 될 수 있습니다.

pylint 2.4의 경우 :에 스타일을 로깅을위한 3 개 가지 옵션이 있습니다 .pylintrc파일 : old, new,fstr

fstr2.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

에 대한 ( 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
"python.linting.pylintArgs": ["--logging-format-style=old"]vscode / settings.json 파일에 추가 할 수 있습니다 . docs
mustafagok

2
pylint 2.3.1에서 : optparse.OptionValueError: option logging-format-style: invalid value: 'fstr', should be in ['old', 'new']최신 pylint (2.4.4)로 업그레이드하면이 문제가 해결되었습니다.
Florian Castellane

다음과 같은 오류가 있습니다.Try installing a more recent version of python-pylint, and please open a bug report if the issue persists in t\ he latest release. Thanks!
alper

4

내 경험상 게으른 보간에 대한 최적화 (대부분의 사용 사례)보다 더 설득력있는 이유는 Sentry와 같은 로그 수집기와 잘 어울린다는 것입니다.

'사용자 로그인'로그 메시지를 고려하십시오. 사용자를 형식 문자열로 보간하는 경우 사용자 수만큼 고유 한 로그 메시지가 있습니다. 이와 같이 지연 보간을 사용하면 로그 수집기는이를 여러 인스턴스가있는 동일한 로그 메시지로보다 합리적으로 해석 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.