program tip

파이썬에서는 왜 인쇄 대신 로깅을 사용합니까?

radiobox 2020. 11. 15. 11:07
반응형

파이썬에서는 왜 인쇄 대신 로깅을 사용합니까?


복잡한 프로젝트에서 간단한 디버깅을 위해 인쇄 대신 파이썬 로거를 사용하는 이유가 있습니까? 다른 사용 사례는 어떻습니까? 각각에 대해 허용되는 최상의 사용 사례가 있습니까 (특히 표준 출력 만 찾고있는 경우)?

이것이 "모범 사례"라고 항상 들었지만 그 이유를 알 수 없었습니다.


로깅 패키지에는 많은 유용한 기능이 있습니다.

  • 로깅 호출이 언제 어디서 발생하는지 (어떤 라인 번호라도) 쉽게 확인할 수 있습니다.
  • 파일, 소켓, 거의 모든 것에 동시에 기록 할 수 있습니다.
  • 심각도에 따라 로깅을 구별 할 수 있습니다.

인쇄물에는 이러한 항목이 없습니다.

또한 프로젝트를 다른 파이썬 도구로 가져 오려는 경우 사용자가 인쇄 메시지가 어디에서 오는지 알지 못할 가능성이 높기 때문에 패키지가 항목을 stdout으로 인쇄하는 것은 좋지 않습니다. 로깅을 통해 패키지 사용자는 도구에서 로깅 메시지를 전파할지 여부를 선택할 수 있습니다.


적절한 로깅의 가장 큰 장점 중 하나는 메시지를 분류하고 필요한 항목에 따라 켜거나 끌 수 있다는 것입니다. 예를 들어, 프로젝트의 특정 부분에 대해 디버깅 수준 메시지를 설정하고 다른 부분에 대해서는 톤을 낮추어 정보 과부하로 인해 영향을받지 않고 필요한 작업에 쉽게 집중할 수 있도록하는 것이 유용 할 수 있습니다. 벌채 반출.

또한 로그를 구성 할 수 있습니다. 쉽게 필터링하고, 파일로 보내고, 형식을 지정하고, 타임 스탬프를 추가하고, 전 세계적으로 필요할 수있는 기타 모든 것을 쉽게 할 수 있습니다. 인쇄 명세서는 쉽게 관리되지 않습니다.


Print 문은 온라인 디버거의 부정적인 측면과 진단 도구를 결합한 두 가지 모두 에서 최악입니다 . 프로그램수정해야 하지만 더 많은 유용한 코드얻을 수 없습니다 .

온라인 디버거를 사용하면 실행중인 프로그램의 상태를 검사 할 수 있습니다. 그러나 실제 디버거의 좋은 점은 소스를 수정할 필요가 없다는 것입니다. 디버깅 세션 전후 모두; 프로그램을 디버거에로드하고 원하는 위치를 디버거에 알리면 모든 설정이 완료됩니다.

애플리케이션을 계측하는 데는 사전에 약간의 작업이 필요하고 어떤 방식 으로든 소스 코드를 수정할 수 있지만 결과 진단 출력은 엄청난 양의 세부 정보를 포함 할 수 있으며 매우 특정한 정도로 켜거나 끌 수 있습니다. 파이썬 로깅 모듈은 로깅 된 메시지뿐만 아니라이를 호출 한 파일과 함수,있는 경우 추적, 메시지가 방출 된 실제 시간 등을 표시 할 수 있습니다. 그 이상; 진단 도구는 제거 할 필요가 없습니다 . 프로그램이 추가 된 날과 마찬가지로 프로그램이 완료되고 프로덕션 단계에서 유효하고 유용합니다. 하지만 누구에게도 귀찮게하지 않는 로그 파일에 출력이 멈춰 있거나 가장 긴급한 메시지를 제외한 모든 메시지를 차단하기 위해 로그 수준을 낮출 수 있습니다.

디버거의 필요성이나 사용을 예상하는 것은 테스트하는 동안 ipython을 사용하고 내장 된 pdb 디버거를 제어하는 ​​데 사용하는 명령에 익숙해지는 것보다 어렵지 않습니다.

print 문이 pdb를 사용하는 것보다 더 쉬울 수 있다고 생각할 때 (자주 그렇듯이), 로거를 사용하면 print 문을 사용하고 나중에 제거하는 것보다 훨씬 쉽게 상태에서 작업 할 수 있음을 알 수 있습니다. .

내 편집기는 print 문을 구문 오류 로 강조 표시 하고 문을 주석으로 로깅 하도록 구성 했습니다.


로깅을 사용하는 경우 배포 담당자는 사용자 지정 정보와 함께 사용자 지정 위치로 보내도록 로거를 구성 할 수 있습니다. 인쇄 만하면 그게 전부입니다.


로깅은 기본적으로 다른 메타 데이터 (타임 스탬프, 로그 수준, 줄 번호, 프로세스 등)와 함께 인쇄 출력의 검색 가능한 일반 텍스트 데이터베이스를 만듭니다.

이것은 순금이며, 파이썬 스크립트가 실행 된 로그 파일에서 egrep을 실행할 수 있습니다 . 내 egrep 패턴 검색을 조정하여 내가 원하는 것을 정확히 선택하고 나머지는 무시할 수 있습니다. 인지 부하의 감소와 나중에 시행 착오를 통해 내 egrep 패턴을 선택할 수있는 자유가 저에게 중요한 이점입니다.

tail -f mylogfile.log | egrep "key_word1|key_word2"

이제 인쇄 할 수없는 다른 멋진 일 (소켓으로 보내기, 디버그 수준 설정, logrotate, 메타 데이터 추가 등)을 넣으면 일반 인쇄 문보다 로깅을 선호하는 모든 이유가 있습니다.

나는 게으르고 쉽기 때문에 print 문을 사용하는 경향이 있습니다. 로깅을 추가하려면 약간의 보일러 플레이트 코드가 필요합니다. yasnippets (emacs) 및 ultisnips (vim) 및 기타 템플릿 도구가 있으므로 일반 인쇄 문에 대한 로깅을 포기하는 이유는 무엇입니까?

참고 URL : https://stackoverflow.com/questions/6918493/in-python-why-use-logging-instead-of-print

반응형