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


91

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

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


3
큰 프로젝트의 경우 로깅은 쉽게 켜거나 끌 수 있고 더 많거나 적은 정보를 얻을 수 있기 때문에 항상 "모범 사례"입니다. print는 이러한 이점을 제공하지 않습니다.
Chris Eberle


3
.NET에 대한 최상의 사용 사례 는 없다고 생각 합니다 print.
SingleNegationElimination 2011-08-02

4
파이썬 로깅 문서 에 가장 적합한 사용 사례는 말한다 print명령 줄 응용 프로그램에서 사용자에 대한 도움말 메시지를 표시하는 것입니다.
slushy

이 모든 답변을 읽고 반대 질문을하고 싶습니다. 로깅을 사용 하지 않는 이유가 있습니까?
information_interchange

답변:


101

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

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

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

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


2
아주 잘했다. 정확히 한 번 실행하려는 일회용 스크립트를 디버깅 할 때 가끔 print를 사용하지만, 다른 사람의 눈으로 본 적이 있거나 하루 이상 지속될 코드는 로거가됩니다.
TimothyAWiseman

22

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

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


3
출력을 파일로 보내기 위해 확실히 +1. 사후 분석에서 로그 파일을 구문 분석하는 것이 오류를 찾기 위해 열린 콘솔 창에서 다시 중단되는 것보다 훨씬 낫습니다. 기본적으로 로거는 실패하는 동안이 아니라 실패한 후 스크립트를 디버그해야하는 경우에 이상적입니다. 또한 프로그램 출력을 분석해야하는 복잡한 문제를 디버깅해야하는 경우에도 이상적입니다. 기본적으로 구문 오류보다 복잡한 오류를 처리 할 때마다 로거는 아마도이를 단순화 할 것입니다.
Jonathanb

11

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

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

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

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

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

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


4

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


1

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

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

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

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

나는 게으르고 쉽기 때문에 print 문을 사용하는 경향이 있습니다. 로깅을 추가하려면 보일러 플레이트 코드가 필요합니다. yasnippets (emacs) 및 ultisnips (vim) 및 기타 템플릿 도구가 있습니다.

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