如何编写自定义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'