답변:
logging모듈은 당신이 원하는 수있는 모든 것을 갖추고 있습니다. 처음에는 과도 해 보일 수 있지만 필요한 부분 만 사용하십시오. 내가 사용하는 것이 좋습니다 것 logging.basicConfig로깅 수준 전환 stderr하고 간단한 로그 방법 , debug, info, warning, error와 critical.
import logging, sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logging.debug('A debug message!')
logging.info('We processed %d records', len(processed_records))
level는 basicConfig호출 에서을 logging.ERROR.
logging.basicConfig(stream=sys.stderr, level=logging.ERROR)효과가 없습니다. 커널을 다시 시작하고 새 수준을 설정하면 작동하지만 그게 저에게는 해결 방법입니다.
이를 수행하는 간단한 방법은 로깅 함수를 호출하는 것입니다.
DEBUG = True
def log(s):
if DEBUG:
print s
log("hello world")
그런 다음 DEBUG로깅을 사용하거나 사용하지 않고 코드 의 값을 변경 하고 실행할 수 있습니다.
표준 logging모듈에는 이에 대한보다 정교한 메커니즘이 있습니다.
logging(매우 간단한 수준에서) 어떻게 작동 하는지에 대한 좋은 아이디어입니다 .
먼저, 저는 파이썬의 로깅 프레임 워크를 두 번째로 지명 할 것 입니다. 그러나 사용 방법에 대해 약간주의하십시오. 특히 : 로깅 프레임 워크가 변수를 확장하도록 허용하고 직접 수행하지 마십시오. 예를 들어 다음 대신 :
logging.debug("datastructure: %r" % complex_dict_structure)
다음을 확인하십시오.
logging.debug("datastructure: %r", complex_dict_structure)
비슷해 보이지만 첫 번째 버전은 비활성화 된 경우에도 repr () 비용 이 발생하기 때문 입니다. 두 번째 버전은 이것을 피합니다. 마찬가지로, 직접 굴려도 다음과 같은 것을 제안합니다.
def debug_stdout(sfunc):
print(sfunc())
debug = debug_stdout
다음을 통해 호출 :
debug(lambda: "datastructure: %r" % complex_dict_structure)
다시 한 번 다음을 수행하여 비활성화하면 오버 헤드를 피할 수 있습니다.
def debug_noop(*args, **kwargs):
pass
debug = debug_noop
이러한 문자열을 계산하는 오버 헤드는 1) 계산에 비용이 많이 들거나 2) 디버그 문이 n ^ 3 루프 등의 중간에 있지 않는 한 중요하지 않습니다. 나는 그것에 대해 아무것도 알지 못합니다.
나는 다른 사람에 대해 잘 모르겠지만, 내가 정의하는 데 사용했다 "글로벌 상수" ( DEBUG) 다음 전역 함수 ( debug(msg)인쇄 할) msg경우에만를 DEBUG == True.
그런 다음 다음과 같이 디버그 문을 작성합니다.
debug('My value: %d' % value)
... 그런 다음 단위 테스트를 선택하고 다시는하지 않았습니다! :)
print()테스트를 통과하는 데 필요한 수준으로 코드를 가져 오는 동안 몇 번 정도입니다 . 나는 print()모든 곳 에서 엄청난 양으로 끝나지 않습니다 . 로깅도 멋지다! :)