파이썬 : 경고 및 로깅 장황한 한도
문제
내 앱의 전체 벌목 시설을 통일하고 싶습니다. 모든 경고는 예외를 제기하는 것입니다. 다음은 잡아서 로거로 전달합니다. 그러나 질문 : 음소거 시설을 기록하고 있습니까? 때때로 로거는 너무 장황 해집니다. 때로는 너무 시끄러운 경고의 이유 때문에 경고에는 장황한 한계가 있습니까?
해결책
거기뿐만 아니라 로그 레벨, 그러나 정말 유연한 것이 있습니다 그들을 구성하는 방법. 이름을 사용하는 경우 logger
물체 (예 : logger = logging.getLogger(...)
) 그런 다음 적절하게 구성 할 수 있습니다. 이를 통해 서브 시스템 별 하위 시스템 기준으로 Verbosity를 구성 할 수 있습니다. 하위 시스템 로깅 계층 구조로 정의됩니다.
다른 옵션은 사용하는 것입니다 logging.Filter
그리고 경고 필터 출력을 제한합니다. 나는 전에이 방법을 사용하지 않았지만 당신의 요구에 더 잘 맞는 것처럼 보입니다.
주다 PEP-282 파이썬에 대한 좋은 산문 설명을위한 읽기 logging
패키지. 모듈 문서보다 기능이 훨씬 더 잘 설명된다고 생각합니다.
설명 후 편집
당신은 logging.Logger
및 등록 logging.setLoggerClass()
. Syslog의 것과 비슷한 것을 원한 것 같습니다. "마지막 메시지는 9 번 반복되었습니다". 불행히도 나는 어디서나 이것의 구현을 모른다. 당신은 있는지보고 싶을 수도 있습니다 Twisted.python.log 이 기능을 지원합니다.
다른 팁
당신이 언급 한 바로 그 출처에서. 로그 레벨이 있습니다. 현명하게 사용하십시오 ;-)
LEVELS = {'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'critical': logging.CRITICAL}
오류를 제기 한 코드에 대해 아무것도 모르는 블라인드 오류 핸들러에서 모든 로깅 호출을 할 계획이라면 문제가됩니다. 어떤 로깅 통화가 이루어지고 그렇지 않은지 어떻게 결정 하시겠습니까?
보다 표준적인 관행은 그러한 블록을 사용하여 가능한 경우 복구하고 오류를 기록하는 것입니다 (실제로는 준비되지 않은 오류 인 경우, 이에 대해 알고 싶어합니다. 높은 수준을 사용하십시오). 그러나 모든 주/디버그 정보에 대해이 블록에 의존하지 마십시오. 오류 처리기에 도달하기 전에 로깅 통화로 코드를 뿌리는 것이 좋습니다. 이렇게하면 시스템이 실패하지 않을 때 시스템에 대한 유용한 런타임 정보를 관찰 할 수 있으며 심각도가 다른 로그 호출을 할 수 있습니다. 예를 들어:
import logging
from traceback import format_exc
logger = logging.getLogger() # Gives the root logger. Change this for better organization
# Add your appenders or what have you
def handle_error(e):
logger.error("Unexpected error found")
logger.warn(format_exc()) #put the traceback in the log at lower level
... #Your recovery code
def do_stuff():
logger.info("Program started")
... #Your main code
logger.info("Stuff done")
if __name__ == "__main__":
try:
do_stuff()
except Exception,e:
handle_error(e)