[python] PyLint 메시지 : logging-format-interpolation

다음 코드의 경우 :

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

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

로깅 형식 보간 (W1202) :

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

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



답변

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

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

넌해야 해

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

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

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


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

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


답변

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

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

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 옵션을 선호합니다 .


답변

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

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


답변