2015-01-18 2 views
2

내가 작업중인 Python 응용 프로그램에 사용자 정의 로거를 추가하고 싶습니다. 나는 로깅 모듈이 이러한 유형의 커스터마이징을 지원하려고하지만 로깅 모듈을 사용하는 일반적인 방법과 어떻게 작동하는지 실제로 알지 못한다. 일반적으로, 당신은 어딘가에 응용 프로그램에서 python logging setLoggerClass를 사용하는 방법?

import logging 
logger = logging.getLogger(__name__) 

그러나, 같은 모듈에 아마도 엔트리 포인트를 로거 객체를 만들 것이다, 나는 나의 로거 클래스를 사용 로깅 모듈을 이야기해야합니다

logging.setLoggerClass(MyLogger) 

그러나 모듈을 가져오고 로거 개체가 이미 할당 된 후에이 호출이 자주 수행됩니다. 이 문제를 해결할 수있는 몇 가지 방법을 생각해 볼 수 있습니다. (관리자 클래스를 사용하여 로거 할당을 등록하거나 각 로그 레코드에 대해 getLogger()를 호출합니다. - yuk) 그러나 이것은 옳은 생각이 아니며, 이렇게하는 방법이 있습니다.

답변

1

로깅 초기화/설정/사용자 정의는 응용 프로그램 코드를 실행하기 전에 수행해야합니다. 주 응용 프로그램 디렉토리의 __init__.py 파일에이 파일을 넣으면됩니다 (이는 모듈을 가져 오거나 읽기 전에 실행 됨).

settings.py 모듈에 넣고 해당 모듈을 응용 프로그램의 첫 번째 항목으로 가져올 수도 있습니다. 언제든지 로깅 설정 코드가 실행되기 전에 getLogger 전화가 오면 좋은 상태입니다.

+0

Argh. 일반적으로 패키지 구조 및 편리한 함수 가져 오기에 초기화를 위해 실제로 \ _ \ _ init \ _ \ _. py 파일을 사용하지 않았습니다. 그것은 초기화 코드에 대한 올바른 장소입니다 꽤 분명해 보인다 :) 그러나 로거에 추가하려는 로깅 핸들러 중 하나는 파일 핸들러이므로 사용자가 명령 줄에서 지정할 수있는 로그 경로가 있습니다. 인스턴스에 대한 변경을 전달할 수있는 클래스 변수로 추가 할 수 있다고 생각하지만 경쟁 조건을 생성하기 때문에이를 수행하는 좋은 방법이라고 생각하지 않습니다. – jdowner

+0

약간의 실험 후, 나는 이해한다고 생각한다. 이전에는 로거 초기화의 일부로 핸들러를 설치했는데 잘못된 작업이라고 생각합니다. 나는 핸들러 추가를 진입 점 코드로 옮겨서 파일 처리기의 모든 경쟁 조건을 피하고 logging.getLogger()를 사용하는 모듈이 내가 원하는대로 사용자 정의 된 클래스를 얻도록 보장합니다. 당신의 도움을 주셔서 감사합니다! – jdowner