2014-05-12 2 views
1

로그가 등록되는 방법을 함수가 정의하는 log.py 모듈을 만들었습니다. 여기서 원자 코드 :파이썬 - 여러 파일에 대한 로거

import logging 
import time 

def set_up_log(): 
    """ 
    Create a logging file. 
    """ 
    # 
    # Create the parent logger. 
    # 
    logger = logging.getLogger(__name__) 
    logger.setLevel(logging.INFO) 
    # 
    # Create a file as handler. 
    # 
    file_handler = logging.FileHandler('report\\activity.log') 
    file_handler.setLevel(logging.INFO) 
    formatter = logging.Formatter('%(asctime)s - %(filename)s - %(name)s - % (levelname)4s - %(message)s') 
    file_handler.setFormatter(formatter) 
    logger.addHandler(file_handler) 
    # 
    # Start recording. 
    # 
    logger.info('______ STARTS RECORDING _______') 

if __name__=='__main__': 
    set_up_log() 

잠재적 오류를 기록하는이 log.py를 사용 read_file.py라는 2 모듈.

No handlers could be found for logger "__main__"

파일의 내 결과는 다음과

2014-05-12 13:32:58,690 - log.py - log - INFO - ______ STARTS RECORDING _______

I는 명령 프롬프트가 read_file.py을 런칭에

import logging 
import log 
log.set_up_log() 
logger = logging.getLogger(__name__) 


def read_bb_file(input_file): 
    """ 
    Input_file must be the path. 
    Open the source_name and read the content. Return the result. 
    """ 
    content = list() 
    logger.info('noi') 
    try: 
     file = open(input_file, 'r') 
    except IOError, e: 
     logger.error(e) 
    else: 
     for line in file: 
      str = line.rstrip('\n\r') 
      content.append(str) 
     file.close() 
     return content 

if __name__ == "__main__": 
    logger.info("begin execution") 
    c = read_bb_file('textatraiter.out') 
    logger.info("end execution") 

, 나는이 오류 여기와 파이 닥에 대해 많은 주제를 읽었지 만 나는 이해하지 못했다. 나는이 오류가 있기 때문에 제대로. 나는 함수에 로그 합의 appart를 유지하고 그것을 나의 주된 방법으로 명시 적으로 정의하고 싶지 않다.

답변

2

2 개의 별개 로거가 있으며 하나만 구성해야합니다.

첫 번째는 log.py에서 작성한 것으로 올바르게 설정되었습니다. 그러나이 모듈을 read_file.py에서 가져 왔으므로 그 이름은 log입니다. 두 번째 로거는 첫 번째 로거와 같지만 logger 변수에 할당 한 로거는 read_file.py입니다. 커맨드 라인에서이 모듈을 호출하기 때문에 그 이름은 __main__이 될 것입니다. 이 로거를 구성하지 않았습니다.

매개 변수를 set_up_log에 추가하여 로거 이름을 전달할 수 있습니다 (예 :

그런 식으로 올바른 로깅 인스턴스에 대한 처리기와 포맷터를 설정하게됩니다.

로그를 계층 구조로 구성하는 것은 모듈 작성자 인 Vinay Sajip이 로깅을 사용하는 방법입니다. 따라서 모듈은 __name__에 지정된 것처럼 정규화 된 이름으로 로깅 인스턴스에만 로깅합니다. 그런 다음 응용 프로그램 코드가 set_up_log 함수로 수행하려는 로거를 설정할 수 있습니다. 관련 이름을 전달하는 것만 기억하면됩니다. 그게 전부입니다. 당시 this reference 매우 유용했습니다.

+0

완벽하게 질문에 대답, 두 번째 로거 실제로 구성되어 있지 않습니다! 고마워, 난 마지막으로 귀하의 링크를 선택하지 않음으로써 기능을하지만 루트 logger 파일에 logger 파일과 매개 변수 '__name__'와 함께 로거를 설정하여 read_file.py! –

+0

@Alek_San, 그런 다음 "받아들이 기"를 고려하십시오. 이는 일반적인 질문이므로 SO 문제가 해결됩니다. –