우리가 개발중인 파이썬 응용 프로그램에는 로거가 필요합니다. 동료는 그것을 사용하는 모든 클래스에서 로거를 작성하고 구성해야한다고 주장합니다. 내 생각에 그것은 응용 프로그램 시작시 생성 및 구성되어야하며 생성자 매개 변수로 전달되어야합니다.파이썬 로거를 매개 변수로 전달해야합니까?
두 가지 변종 모두 장점이 있으며 모범 사례가 확실하지 않습니다.
우리가 개발중인 파이썬 응용 프로그램에는 로거가 필요합니다. 동료는 그것을 사용하는 모든 클래스에서 로거를 작성하고 구성해야한다고 주장합니다. 내 생각에 그것은 응용 프로그램 시작시 생성 및 구성되어야하며 생성자 매개 변수로 전달되어야합니다.파이썬 로거를 매개 변수로 전달해야합니까?
두 가지 변종 모두 장점이 있으며 모범 사례가 확실하지 않습니다.
어쩌면 이것은 당신이 아이디어를 얻을하는 데 도움이? 물론 설정 파일이나 설정 파일에서 설정을 읽는 것이 훨씬 더 효과적 일 수 있습니다. 자체 테스트와 모듈에서
import logging
from mylogmod import startlogging
from myclass import MyClass
startlogging()
logging.info("Program started...")
mc = MyClass()
클래스 myclass.py
: mylogmod.py
: :이 main.py
import logging
FILENAME = "mylog.log" # Your logfile
LOGFORMAT = "%(message)s" # Your format
DEFAULT_LEVEL = "info" # Your default level, usually set to warning or error for production
LEVELS = {
'debug':logging.DEBUG,
'info':logging.INFO,
'warning':logging.WARNING,
'error':logging.ERROR,
'critical':logging.CRITICAL}
def startlogging(filename=FILENAME, level=DEFAULT_LEVEL):
logging.basicConfig(filename=filename, level=LEVELS[level], format=LOGFORMAT)
별도의 모듈
로깅을 구성 할 수 있습니다. 단위 테스트에서 로깅 모듈을 가져올 필요가 없으므로startlogging
함수만으로도 충분합니다.이 방법으로 기본 수준을 경고 또는 오류로 설정할 수 있으며 unittests 및 self 디버그 테스트)
import logging
class MyClass(object):
def __init__(self):
logging.info("Initialze MyClass instance...")
if __name__ == "__main__":
from mylogmod import startlogging
startlogging(level="debug")
logging.debug("Test MyClass...")
#... rest of test code...
이것은 루트 로거를 사용하고 있습니다. 다른 응용 프로그램과 통합되는 정교한 응용 프로그램은 루트 로거를 사용하고 싶지 않습니다. –
매개 변수로 로거를 전달하는 것이 좋지 않다고 생각합니다. 글로벌 로거를 자체 모듈로 생각하면 최상의 아이디어 일 것입니다. 예를 들어 :
logger.py
import logging
log = logging.getLogger('')
classFoo.py
form logger import log
log.debug('debug message')
classBar.py는
form logger import log
log.warn('warn!')
'__name__'이라는 이름의 로거를 사용하는 대신 빈 문자열이있는 이름의 로거를 항상 사용하기 때문에 좋은 생각이 아닙니다. 내 대답을 참조하십시오. –
일반적으로 그렇지 않습니다. 일반적으로 매개 변수로 전달되지는 않습니다.
규칙은 각 모듈의 맨 위에 log = logging.getLogger(__name__)
을 사용하는 것입니다. __name__
의 값은 각 모듈마다 다릅니다. 결과 값 __name__
은 각 로그 메시지에 반영 될 수 있습니다.
로거를 한 번만 구성하면되고 다른 클래스에서는 로깅 모듈을 가져 오면됩니다. 이 함수를 가져 와서 클래스 나 모듈을 테스트 할 수 있도록 'configure_logging'함수를 별도의 모듈 또는 기본 모듈에 만드는 것이 좋습니다. ('if __name__ == "__main __"'또는'unittest'에 start_logging을 임포트하십시오.) – joente
단위 테스트의 경우 로거를 조롱하고 싶습니다. 로깅 모듈. –
로거를 구현하는 것이 어떤 의미인지 더 잘 알기 위해 예를 들어 답변을 게시했습니다. 도움이 되었으면 좋겠습니다. 물론 아이디어 일 뿐이며 자신의 사례에 가장 적합한 솔루션을 찾으시기 바랍니다. – joente