2010-06-25 7 views
39

콘솔 로그 창에서만 출력 할 사용자 지정 콘솔 로그 기능을 작성하는 방법은 첫 번째 정규 로그 레코드가 될 때까지 한 줄로 추가하지 않고 로그 메시지를 기록합니다.사용자 정의 파이썬 로깅 처리기를 작성하는 방법?

progress = ProgressConsoleHandler() 
console = logging.StreamHandler() 

logger = logging.getLogger('test') 
logger.setLevel(logging.DEBUG) 
logger.addHandler(console) 
logger.addHandler(progress) 

logger.info('test1') 
for i in range(3): 
    logger.progress('remaining %d seconds' % i) 
    time.sleep(1) 
logger.info('test2') 

따라서 콘솔 출력은 세 줄 것을 :

INFO: test1 
remaining 0 seconds... 
INFO: test2 

이를 구현하는 방법에 대한 최선의 방법에 대한 어떤 제안?

하나의 핸들러가 등록되고
+0

'log'는 어디에 정의되어 있습니까? ... '수학'의 '로그'를 제외하고 ... –

+0

이들 대부분이 도움이됩니다. http://stackoverflow.com/search?q=python+logging+handler –

+0

[ 로깅 처리기] (http://stackoverflow.com/questions/2819791/redirect-logging-output-using-custom-logging-handler) –

답변

45
import logging 
class ProgressConsoleHandler(logging.StreamHandler): 
    """ 
    A handler class which allows the cursor to stay on 
    one line for selected messages 
    """ 
    on_same_line = False 
    def emit(self, record): 
     try: 
      msg = self.format(record) 
      stream = self.stream 
      same_line = hasattr(record, 'same_line') 
      if self.on_same_line and not same_line: 
       stream.write(self.terminator) 
      stream.write(msg) 
      if same_line: 
       stream.write('... ') 
       self.on_same_line = True 
      else: 
       stream.write(self.terminator) 
       self.on_same_line = False 
      self.flush() 
     except (KeyboardInterrupt, SystemExit): 
      raise 
     except: 
      self.handleError(record) 
if __name__ == '__main__': 
    import time 
    progress = ProgressConsoleHandler() 
    console = logging.StreamHandler() 

    logger = logging.getLogger('test') 
    logger.setLevel(logging.DEBUG) 
    logger.addHandler(progress) 

    logger.info('test1') 
    for i in range(3): 
     logger.info('remaining %d seconds', i, extra={'same_line':True}) 
     time.sleep(1) 
    logger.info('test2') 

공지 사항 및 핸들러를 할 수있는 extra 키워드 인수는 한 줄에 유지해야한다 알고있다. emit() 메서드에는 한 줄에 있어야하는 메시지와 자체 줄이 필요한 메시지 간의 변경을 처리하는 논리가 더 있습니다.

+9

참고 사항 : 'terminator'속성은 파이썬> 3.2, https://mail.python.org/pipermail/python-list/2010-October/590223.html 참조 – Pat

관련 문제