如何编写自定义 python 日志处理程序? [英] How to write custom python logging handler?
问题描述
如何编写自定义控制台日志函数以仅在控制台窗口上输出一行(不追加)日志消息,直到第一条常规日志记录.
How to write custom console log function to output only on the console window log messages on a single line (not append) until the first regular log record.
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')
这样控制台输出只有三行:
So that the console output is only three lines:
INFO: test1
remaining 0 seconds...
INFO: test2
关于如何实现这一点的最佳方式有什么建议吗?
Any suggestions on the best way on how to implement this?
推荐答案
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()
方法中有更多的逻辑来处理应该留在一行的消息和需要有自己的行的消息之间的变化.
Notice that only one handler is being registered, and the extra
keyword argument to let the handler know it should stay on one line. There is more logic in the emit()
method to handle changes between messages that should stay on one line and messages that need to have their own line.
这篇关于如何编写自定义 python 日志处理程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!