如何编写自定义python日志处理程序?
问题描述:
如何编写自定义控制台日志功能,以便仅在控制台窗口上输出日志消息,直到第一个常规日志记录为止(不附加)。如何编写自定义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
关于如何实现这一目标的最佳方式有什么建议?只有一个处理程序被注册
答
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
'log'定义在哪里? ...除了'数学'中的'log' ... – 2010-06-25 12:46:44
这些应该很有帮助:http://stackoverflow.com/search?q=python+logging+handler – 2010-06-25 12:55:06
重定向使用自定义日志输出日志处理程序](http://stackoverflow.com/questions/2819791/redirect-logging-output-using-custom-logging-handler) – 2010-06-25 12:55:17