Python 에서 logging 실례 설명

2888 단어 Pythonlogging
logging 의 기본 용법 은 인터넷 에 매우 많 으 니 여 기 는 소개 하지 않 겠 습 니 다.본문 을 도입 하기 전에 먼저 하나의 수 요 를 살 펴 보 자.
어떤 기능 을 다른 사람 이 사용 할 수 있 도록 라 이브 러 리 로 봉 해 야 한다 고 가정 하면 라 이브 러 리 의 로 그 를 어떻게 처리 합 니까?
몇 년 전에 한 C\#개발 프로젝트 에서 저 는 이런 방법 을 사 용 했 습 니 다.logging 기본 클래스 를 정의 하고 로그 에 필요 한 모든 클래스 가 이 기본 클래스 를 계승 합 니 다.이 기본 클래스 에서 LogHandler 사건 을 정의 합 니 다.이 사건 은 구체 적 인 기록 로그 동작 을 실현 하 는 동시에 A 류 의 LogHandler 를 클래스 B 의 LogHandler 에 의뢰 할 수 있 습 니 다.두 종류의 로그 정 보 를 함께 추가 합 니 다.
python 에서 logging 의 실현 방식 을 본 후부 터 나 는 나의 방법 이 정말 약 하 다 는 것 을 알 게 되 었 다.
이전 블 로그 Python:logging.NullHandler 사용 에서 peewee 프레임 워 크 의 로그 출력 을 소 개 했 습 니 다.쉽게 말 하면 peewee 에서 peewee 라 는 Logger 를 정의 하고 NullHandler 를 추 가 했 습 니 다.호출 자 는 구체 적 인 Handler 만 추가 하면 로 그 를 잃 을 수 있 습 니 다.매우 편리 합 니 다.

주 프로그램 에 도 Logger 가 있다 고 가정 하고 peewee 를 호출 한 후에 두 로 그 를 같은 로그 파일 에 출력 하고 싶 습 니 다.분명히 두 로그 의 FileHandler 를 같은 로그 파일 로 가리 키 는 것 은 바람 직 하지 않 으 며,동시에 파일 을 선점 할 위험 이 존재 합 니 다.물론 메 인 프로그램의 Logger 이름 을 peewee 로 정할 수도 있 지만,이것 은 너무 낮 을 뿐만 아니 라,라 이브 러 리 하 나 를 더 호출 하면,그 중 에 Logger 하 나 를 봉 하여 처리 하기 가 쉽 지 않다.
말뚝 구조의 Logger
Logger 대상 은 parent 속성 이 있 는 트 리 구조 로 설계 되 었 습 니 다.logging 에 서 는 루트 라 는 Logger 를 모든 Logger 의 루트 노드 로 정의 하고 루트 의 parent 속성 은 None 입 니 다.루트 는 전역 적 이다.
호출

logging.getLogger(name=None)
Logger 대상 을 가 져 왔 을 때 name 이 None 이면 루트 를 되 돌려 줍 니 다.만약 name 에.,예 를 들 어 name='a.b'가 포함 되 어 있다 면,이때 a 라 는 Logger 가 이미 존재 한다 면 a.b 는 a 의 하위 노드 이 고,a 라 는 Logger 가 존재 하지 않 는 다 면 a.b 는 루트 의 하위 노드 이다.
child logger 는 로그 메 시 지 를 처리 한 후 기본적으로 로그 메 시 지 를 parent logger 에 전달 합 니 다.따라서,우 리 는 한 프로그램 에서 사용 하 는 모든 Logger 에 handlers 를 정의 하고 설정 할 필요 가 없습니다.하나의 최상 위 Logger 에 handlers 를 설정 한 다음 필요 에 따라 child loggers 를 만 들 면 충분 합 니 다.Logger 의 propagate 속성 을 False 로 설정 하여 이 전달 체 제 를 닫 을 수 있 습 니 다.
무슨 뜻 이 죠?코드 를 보 겠 습 니 다.

import logging
logA = logging.getLogger('a')
logA.setLevel(logging.DEBUG)
logA.addHandler(logging.StreamHandler())
logB = logging.getLogger('a.b')
logB.addHandler(logging.StreamHandler())
출력 결과:

Logger A
Logger B
Logger B
Logger B 가 2 번 출력 된 이 유 는 logB 가 logA 의 하위 노드 이 고 logB 에서 도 Handler 를 정 의 했 기 때문에 logB 의 Handler 가 한 번 출력 했 고,logA 의 Handler 도 한 번 출력 한 것 은 2 번 이 었 다.한 번 만 출력 하려 면 logB 의 Handler 를 삭제 할 수 있 습 니 다.물론 이것 도 쓸모 가 있다.특히 로그 관리 도구 가 없 을 때.예 를 들 어 메 인 프로그램 에 서 는 프로그램의 전체 운행 순 서 를 알 수 있 도록 모든 로 그 를 출력 해 야 합 니 다.어떤 모듈 의 로 그 는 모듈 의 오류 나 실행 순 서 를 분명하게 알 수 있 도록 따로 출력 하고 싶 습 니 다.
이전에 peewee 의 예 도 쉽게 해결 되 었 습 니 다.peewee 로그 의 parent 속성 을 주 프로그램의 로그 로 설정 하면 됩 니 다.
결어
사실 이것 은 비교적 설명 하기 쉬 운 문제 로 이렇게 많이 쓸 필요 가 전혀 없다.저 는 python 의 logging 을 어떻게 사용 하 는 지 여러분 과 공유 하고 싶 지 않 습 니 다.logging 이 이렇게 실현 하 는 사상 을 여러분 과 공유 하고 싶 습 니 다.왜냐하면 저 는 이 문 제 를 겪 었 고 해결 방안 도 설계 한 후에 폭발 되 었 습 니 다.

좋은 웹페이지 즐겨찾기