2017-01-19 2 views
0

파이썬 로깅 서버, 두 개의 테스트 응용 프로그램 및 한 개의 공유 모듈 (submod.py)이 있습니다. 두 응용 프로그램 모두 서버에 로그 이벤트를 보내고 서버를 가질 수 있기를 원합니다. 로그 파일을 별도의 로그 파일에 저장하는 방법을 결정하십시오. 이것은 공유 모듈이 로그하기 시작할 때까지 매우 쉽습니다. 서버가 하위 모듈이 로그 이벤트를 올바른 로그 파일에 저장하기 위해 보내는 프로그램을 식별 할 수있게하는 방법을 알지 못합니다.Python 로깅 - dictConfig - 하위 모듈 로깅 대상

내 로깅 서버 나는 다음과 같은 사전 로깅 구성을 사용하도록 수정하려고 내가

here을 발견 코드의 약간 수정 된 버전입니다 :

test_log.conf

"handlers": { 
      "console": { 
       "class": "logging.StreamHandler", 
       "level": "DEBUG", 
       "formatter": "complex", 
       "stream": "ext://sys.stdout" 
      }, 
      "test_01": { 
       "class": "logging.handlers.RotatingFileHandler", 
       "level": "INFO", 
       "formatter": "complex", 
       "filename": "test_01.log", 
       "mode": "a", 
       "backupCount": 5, 
       "encoding": "utf8" 
      }, 
      "test_02": { 
       "class": "logging.handlers.RotatingFileHandler", 
       "level": "INFO", 
       "formatter": "complex", 
       "filename": "test_02.log", 
       "mode": "a", 
       "backupCount": 5, 
       "encoding": "utf8" 
      }, 
      "file": { 
       "class": "logging.handlers.RotatingFileHandler", 
       "level": "INFO", 
       "formatter": "complex", 
       "filename": "root.log", 
       "mode": "a", 
       "backupCount": 5, 
       "encoding": "utf8" 
      } 
     }, 
     "loggers": { 
      "root": { 
       "level": "INFO", 
       "handlers": ["console", "file"] 
      }, 
      "test_01":{ 
       "level": "INFO", 
       "handlers": ["console", "test_01"] 
      }, 
      "test_02": { 
       "level": "INFO", 
       "handlers": ["console", "test_02"] 
      } 
     } 

test_01.py

main_logger = logging.getLogger('') 
main_logger.setLevel(logging.DEBUG) 

socketHandler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT) 

main_logger.addHandler(socketHandler) 

logging.info('Test 01 main program') 

a = submod.SubClass() 

test_02.py

main_logger = logging.getLogger('') 
main_logger.setLevel(logging.DEBUG) 

socketHandler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT) 

main_logger.addHandler(socketHandler) 

logging.info('Test 02 main program') 

a = submod.SubClass() 

submod.py 내가 로깅 서버를 가질 수있는 방법

class SubClass(object): 
    def __init__(self): 
     log = logging.getLogger() 
     log.debug('Debug') 
     log.info('Info') 
     log.warn('Warning') 
     log.error('Error') 
     log.critical('Critical') 
     print(__name__) 

지능적으로 submod.py에서 메시지를 기록 할 위치를 알고 test_01 모두와 test_02가 전화하고 있습니다.

포맷과 혼란스러운 설명에 사과 드리며,이 문제는이 시점에서 뇌 손상을 일으켰습니다.

편집 됨 : 잘못된 설명을 명료하게 재사용하십시오.

답변

0

로그 파일을 사용하는 프로그램을 기반으로 로깅 파일의 대상을 미리 정의 할 수있는 구성 파일을 사용하면됩니다. 파이썬 "로깅"모듈은 필요한 모든 작업을 수행합니다. 다음은 구성 파일의 예입니다. http://www.zetadev.com/software/aspen/trunk/doc/html/logging-conf.html

+0

참조하는 구성을 이해하면 문제가 해결되지 않습니다. 동일한 하위 모듈을 사용하는 여러 프로그램에 적용 할 수있는 동적 구성을 갖기 위해 노력하고 있지만 서버가 하위 모듈의 메시지를 각 주 프로그램의 로그 파일에 저장할시기를 지능적으로 결정해야합니다. – Chex

+0

알았어, 그럼 이건 어때? https://docs.python.org/2/howto/logging-cookbook.html#using-logging-in-multiple-modules – postoronnim

+0

이것은 작동 할 수 있습니다. 응용 프로그램간에 모듈을 다시 사용하여 정적으로 부모를 할당하고 싶습니다. 약간의 고통입니다. 전화 한 '부모'를 결정할 방법이 있습니까? 아니면 그냥 변수로 부르는 부모의 이름을 전달하고 설정해야합니다. – Chex