2010-06-25 90 views
39

如何编写自定义控制台日志功能,以便仅在控制台窗口上输出日志消息,直到第一个常规日志记录为止(不附加)。如何编写自定义python日志处理程序?

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'定义在哪里? ...除了'数学'中的'log' ... – 2010-06-25 12:46:44

+0

这些应该很有帮助:http://stackoverflow.com/search?q=python+logging+handler – 2010-06-25 12:55:06

+0

重定向使用自定义日志输出日志处理程序](http://stackoverflow.com/questions/2819791/redirect-logging-output-using-custom-logging-handler) – 2010-06-25 12:55:17

回答

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

仅供参考:“终止符”属性仅适用于Python> = 3.2,请参阅https://mail.python.org/pipermail/python-list/2010-October/590223.html – Pat 2014-02-11 23:48:42

相关问题