如何编写自定义python日志处理程序?

如何编写自定义python日志处理程序?,python,logging,console,Python,Logging,Console,如何编写自定义控制台日志函数以仅在控制台窗口上输出单行日志消息(不追加),直到第一条常规日志记录 progress = ProgressConsoleHandler() console = logging.StreamHandler() logger = logging.getLogger('test') logger.setLevel(logging.DEBUG) logger.addHandler(console) logger.addHandler(progress) lo

如何编写自定义控制台日志函数以仅在控制台窗口上输出单行日志消息(不追加),直到第一条常规日志记录

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
关于如何实现这一目标的最佳方式,有什么建议吗

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()
方法中有更多的逻辑来处理应该保留在一行的消息和需要有自己行的消息之间的更改。

哪里定义了
log
。。。除了
math
中的
log
之外,大多数都应该有帮助:遇到这种情况时,可能会重复FYI:“terminator”属性仅在Python>=3.2中可用,请参见^yes@pat,但您可以在2.7/3.7中使用以下内容:
如果没有hasattr(self,'terminator'):
(新行)
self.terminator='\n'