python logging 중복 로그 쓰기 문제 해결 방법 상세 설명

질문
Python 의 logging 모듈 로 로 그 를 기록 할 때 로 그 를 중복 기록 하 는 문제 가 발생 했 습 니 다.첫 번 째 기록 은 한 번 쓰 고 두 번 째 기록 은 두 번 쓰 며 세 번 째 기록 은 세 번 씁 니 다.골 치 아파,이렇게 일 지 를 적어 서 는 안 돼.인터넷 에서 원인 과 해결 방안 을 검색 했다.
이유:handler 를 제거 하지 않 았 습 니 다.
해결:로그 기록 이 끝 난 후 removeHandler
이전 예제 코드 수정:

import logging


def log(message):
 logger = logging.getLogger('testlog')

 streamhandler = logging.StreamHandler()
 streamhandler.setLevel(logging.ERROR)
 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
 streamhandler.setFormatter(formatter)

 logger.addHandler(streamhandler)
 logger.error(message)

if __name__ == '__main__':
 log('hi')
 log('hi too')
 log('hi three')
수정 전 출력 결과:
2016-07-08 09:17:29,740 - ERROR - testlog - hi
2016-07-08 09:17:29,740 - ERROR - testlog - hi too
2016-07-08 09:17:29,740 - ERROR - testlog - hi too
2016-07-08 09:17:29,740 - ERROR - testlog - hi three
2016-07-08 09:17:29,740 - ERROR - testlog - hi three
2016-07-08 09:17:29,740 - ERROR - testlog - hi three
수정 후 예제 코드:

import logging


def log(message):
 logger = logging.getLogger('testlog')

 streamhandler = logging.StreamHandler()
 streamhandler.setLevel(logging.ERROR)
 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
 streamhandler.setFormatter(formatter)

 logger.addHandler(streamhandler)
 logger.error(message)

 #       ,           
 logger.removeHandler(streamhandler)

if __name__ == '__main__':
 log('hi')
 log('hi too')
 log('hi three')
수정 후 출력 결과:
2016-07-08 09:32:28,206 - ERROR - testlog - hi
2016-07-08 09:32:28,206 - ERROR - testlog - hi too
2016-07-08 09:32:28,206 - ERROR - testlog - hi three
깊이 분석:
Google 에 서 는 두 번 째 로 로 그 를 호출 할 때 getLogger(name)의 name 에 따라 같은 logger 를 가 져 왔 다 는 것 을 알 게 되 었 습 니 다.이 logger 에는 처음으로 추가 한 handler 가 있 고 두 번 째 호출 에 handler 가 추가 되 었 기 때문에 이 logger 에는 같은 handler 가 두 개 있 습 니 다.이런 식 으로 몇 번 호출 하면 handler 가 몇 개 있 습 니 다.
그래서 여기 에는 다음 과 같은 몇 가지 해결 방법 이 있다.
  • 서로 다른 name 의 logger 를 만 들 때마다 새 logger 입 니 다.handler 를 추가 하 는 문제 가 없습니다.(ps:이 방법 은 너무 멍청 하지만,나 는 이전에 이렇게 했 어...)
  • 위 와 같이 로 그 를 기록 한 후에 removeHandler()를 호출 하여 이 logger 의 handler 를 제거 합 니 다.log 방법 에서 판단 합 니 다.이 logger 에 handler 가 있 으 면 handler 를 추가 하지 않 습 니 다.
  • 방법 2 와 같 지만 pop 으로 logger 의 handler 목록 에 있 는 handler 를 제거 합 니 다.
  • 다음은 방법 3 과 방법 4 의 코드 예시 입 니 다.
    방법 3:
    
    import logging
    
    
    def log(message):
     logger = logging.getLogger('testlog')
    
     #       ,  logger.handlers    ,   ,  ,      
     if not logger.handlers:
     streamhandler = logging.StreamHandler()
     streamhandler.setLevel(logging.ERROR)
     formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
     streamhandler.setFormatter(formatter)
     logger.addHandler(streamhandler)
    
     logger.error(message)
    
    
    if __name__ == '__main__':
     log('hi')
     log('hi too')
     log('hi three')
    
    방법 4:
    
    import logging
    
    
    def log(message):
     logger = logging.getLogger('testlog')
    
     streamhandler = logging.StreamHandler()
     streamhandler.setLevel(logging.ERROR)
     formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
     streamhandler.setFormatter(formatter)
    
     logger.addHandler(streamhandler)
    
     logger.error(message)
    
     #  pop   logger.handlers    handler  ,     add   handler,     pop,       handlers     
     logger.handlers.pop()
     # logger.handler = []
    
    
    if __name__ == '__main__':
     log('hi')
     log('hi too')
     log('hi three')
    
    이 몇 가지 방법 은 모두 직접 시험 해 볼 수 있 는데,개인 적 으로 방법 3 판단 이 더욱 우아 하 다 고 생각 합 니 다.어떻게 생각 하 세 요?
    python logging 중복 로그 문제 j 해결 방법 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 관련 python logging 중복 로그 문제 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기