kol*_*eto 48 python console logging
如何编写自定义控制台日志功能,仅在控制台窗口上输出日志消息在一行(不附加),直到第一个常规日志记录.
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')
Run Code Online (Sandbox Code Playgroud)
这样控制台输出只有三行:
INFO: test1
remaining 0 seconds...
INFO: test2
Run Code Online (Sandbox Code Playgroud)
关于如何实现这个的最佳方法的任何建议?
Eth*_*man 53
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')
Run Code Online (Sandbox Code Playgroud)
请注意,只有一个处理程序正在注册,并且extra
让处理程序知道它的关键字参数应该保持在一行上.该emit()
方法中有更多逻辑来处理应保留在一行上的消息与需要拥有自己的行的消息之间的更改.