2014-04-25 7 views
0

파이썬으로 로그인하는 방법에 대해 많이 쓰여졌지만 여러 프로젝트에서 로깅을 정렬하는 것에 대해 포괄적 인 내용을 찾지 못했습니다. 예를 들어 사람들이 Github에 공개 된 프로젝트를 재사용한다고 가정하는 것은 무리가 아닙니다 (그것이 바로 그 이유입니다). 모든 프로젝트가 로깅을 필요로한다고 생각합니다. 특히 개발중인 프로젝트입니다. 제 질문은 가능한 한 로깅을 어떻게 사용합니까?여러 프로젝트에서 파이썬 로깅

최근 주 패키지의 __init__.py에있는 구성 파일을로드하는 팬이되었습니다.

import logging.config 
import sys 
from traceback import print_exception 

fileconf = "logging.conf" 
try: 
    logging.config.fileConfig(fileconf) 
except: 
    print "Could not use %s for configuration because:" % (fileconf,) 
    print_exception(*sys.exc_info()) 

다음 각 모듈은 logger.py, 전용 로깅 모듈에서 로거를 얻을 것이다 :
import logging 

def get_logger(name): 
    logger = logging.getLogger(name) 
    return logger 

불행하게도 나는 여러 프로젝트에 대한 간단한 확장이 표시되지 않습니다. 표준과 동일한 구성 파일을 사용할 수 있기를 원합니다.

그렇다면 수퍼 프로젝트의 로깅 구성을 쉽게 사용할 수있는 프로젝트를 어떻게 만들 수 있습니까? 아마도 로깅이 이미 구성되어 있는지 확인하는 것일까 요?

답변

1

로깅 기능을 프로젝트에 추가하려면 로거를 사용해야하고 구성을 사용하려는 사람에게 구성을 남겨 줘야합니다.

def my_method(): 
    try: 
     # do something... 
    except Exception as e: 
     logger = logging.getLogger(__name__) 
     logger.error("error doing something: {}".format(e)) 

__name__ (예 project.path.to.module) 패키지 경로를 포함한 모듈 이름을 반환 그래서 지금 누구든지 사용할 필요가있다 : 예를 들어

,의 당신이 모듈 내부에 뭔가를 기록하고 싶은 말은하자 이 프로젝트 또는 같은 방식으로 로깅을 사용하는 여러 프로젝트는 자체 구성 파일을로드하고 프로젝트 당 로깅 설정을 정의합니다.

피 로딩 모듈 수준에서 구성하지만

을 (충돌을 방지하기 위해 방법 또는 if __name__ == '__main__' 내부) 옵션두고이 좋은 로깅 관행에 대한 좋은 참고처럼 보인다 : http://victorlin.me/posts/2012/08/26/good-logging-practice-in-python

+0

모듈 수준에서 로거를 사용하지 않으려는 이유를 알고 있지만 클래스 수준이나 각 로그 문에서 로거를 가져 오는 것이 좋습니다. –

+0

이 경우 구성이로드되기 전에 로거가 나타날 위험이 있습니다 (설정에서 disable_existing_loggers를 False로 설정하지 않은 경우). 모듈 수준에서 로거를 얻는 것과의 무역이 실제로 보이지 않습니다. 클래스 init 또는 메소드에서 로거를 가져 오는 꽤 값싼 작업. 위의 게시물에서 좋은 방법을 확인하십시오. – sirfz

1

라이브러리 프로젝트를해야 로깅을 구성하지 마십시오 (도우미가 그렇게 할 수는 있지만). 로깅은 주 프로그램에 의해서만 구성되어야하며 코드 경로에도 역시 if __name__ == '__main__'으로 구성되어야합니다. 설명하는 경우 __init__.py이 아닌 패키지 __main__.py (가능한 경우 패키지 가져 오기 시간을 피하는 것이 가장 좋습니다)이 패키지를 실행하는 데 사용됩니다.

내가 (로깅을 수행 각 모듈)

logger = logging.getLogger(__name__) 

를 사용하기 때문에, 당신의 logger.py에가 어떤 값을 이해하지 못한다는 대부분의 사람들에게 꽤 잘 대부분의 시간을 작동합니다.

표준 구성 파일을 사용하려면 루트 로거에 대한 처리기 만 구성하십시오 (그렇지 않으면 프로젝트 별 로거를 구성 할 것이므로). fileConfig()이 아닌 dictConfig()을 사용하면 더 많은 유연성을 얻을 수 있습니다. 기본 구성으로 라이브러리의 구성 사전을 병합합니다.

+0

각 로거에서 수행하길 원하는 추가 작업이 있었지만 더 이상 필요하지 않습니다. Logger.py가있는 이유입니다.'__main __. py'는 아주 좋은 제안입니다. –