2017-11-29 5 views
2

BufferingHandler을 서브 클래스 화하여 logging.handlers 모듈에 서브 클래 싱하여 사용자 정의 플러시 전략을 추가하고 있습니다. logging.handlers.BufferingHandler 로그를 두 번 표시하는 서브 클래 싱 된 핸들

from logging.handlers import BufferingHandler 
import logging 

LOG_FORMAT = '%(asctime)s %(levelname)s: %(message)s' 
logger = logging.getLogger('LogArchiver') 
logger.setLevel(logging.DEBUG) 
formatter = logging.Formatter(LOG_FORMAT) 

class MyLogHandler(BufferingHandler): 
    def __init__(self, capacity): 
     logging.handlers.BufferingHandler.__init__(self, capacity) 

    def flush(self): 
     for record in self.buffer: 
      print(self.format(record)) 
      #pass 

    def shouldFlush(self, record): 
     return False 


h = MyLogHandler(1000) 
h.setLevel(logging.INFO) 
h.setFormatter(formatter) 
logger.addHandler(h) 

if __name__ == '__main__': 
    for i in range(5): 
     logger.info('test %s', i) 

는 잘 작동하지만 BufferingHandler 내가 원하는 해달라고 기본적으로 콘솔에 홍조처럼 두 번 로그 선을 보이고있다. 내가 콘솔에 여분의 높이를보고하고 어디 그것의 인쇄 ..

[email protected]:/mnt/tmp/alok# python /tmp/testlog.py 
2017-11-29 15:01:07,480 INFO: test 0 
2017-11-29 15:01:07,480 INFO: test 1 
2017-11-29 15:01:07,480 INFO: test 2 
2017-11-29 15:01:07,480 INFO: test 3 
2017-11-29 15:01:07,480 INFO: test 4 
2017-11-29 15:01:07,480 INFO: test 0 
2017-11-29 15:01:07,480 INFO: test 1 
2017-11-29 15:01:07,480 INFO: test 2 
2017-11-29 15:01:07,480 INFO: test 3 
2017-11-29 15:01:07,480 INFO: test 4 

이 만

[email protected]:/mnt/tmp/alok# python /tmp/testlog.py 
2017-11-29 15:01:07,480 INFO: test 0 
2017-11-29 15:01:07,480 INFO: test 1 
2017-11-29 15:01:07,480 INFO: test 2 
2017-11-29 15:01:07,480 INFO: test 3 
2017-11-29 15:01:07,480 INFO: test 4 

을 제가 기대를 인쇄해야합니까?

+0

로그를 어떻게 확인합니까? 스크립트가 실행되면'tail -f' 또는 로그 파일을 여는 중입니까? – NoobEditor

+0

해당 사용자 지정 처리기 및 인쇄 로그 만 콘솔에만 사용하고 있습니다. 'FileHandler'를 사용하지 않고 로그를 모니터하기 위해'tail -f' 포인트가 없습니다. –

답변

0

다른 사람의 코드를 본 후 플러시 후 self.buffer을 비우지 못했습니다. 따라서 적절한 코드가 있어야합니다

from logging.handlers import BufferingHandler 
import logging 

LOG_FORMAT = '%(asctime)s %(levelname)s: %(message)s' 
logger = logging.getLogger('LogArchiver') 
logger.setLevel(logging.DEBUG) 
formatter = logging.Formatter(LOG_FORMAT) 

class MyLogHandler(BufferingHandler): 
    def __init__(self, capacity): 
     logging.handlers.BufferingHandler.__init__(self, capacity) 

    def flush(self): 
     for record in self.buffer: 
      print(self.format(record))    
     super(MyLogHandler, self).flush() 

    def shouldFlush(self, record): 
     return False 


h = MyLogHandler(1000) 
h.setLevel(logging.INFO) 
h.setFormatter(formatter) 
logger.addHandler(h) 

if __name__ == '__main__': 
    for i in range(5): 
     logger.info('test %s', i) 
+0

예, (thread-safe 연산을 위해) 부모 클래스'flush()'를 사용해야합니다 : super (MyLogHandler, self). flush()' –

+0

'super (MyLogHandler, self) .flush()'를 사용한다면 어디에서 플러싱 할 때 전자 메일을 보내는 것과 같이 의도 한 플러싱 전략을 넣을 수 있습니까? –

+1

'self.buffer = []'를'super (MyLogHandler, self) .flush()'로 바꾸십시오. –