我有一个使用logging
模块和print
语句的程序。日志记录是告知用户程序正在做什么,例如
logging.info("downloading HTML")
time.sleep(1)
logging.info("parsing HTML")
time.sleep(1)
print "the result"
最后屏幕上的输出(混合stdout和stderr)将是:
INFO:downloading HTML
INFO:parsing HTML
the result
我希望在显示下一个日志记录输出或调用打印时隐藏最后一次日志记录输出。例如,启动程序,您将看到:
INFO:download HTML
等一下,下一个信息"parsing HTML"
将替换之前的"downloading HTML"
,因此您只会在屏幕上看到:
INFO:parsing HTML
之前没有别的,然后等一秒钟,我只想在屏幕上看到:
"the result"
我只在登录stderr时才想要这个功能,而不是在登录文件时,例如,我希望看到所有logging
输出。
有可能吗?
答案 0 :(得分:5)
在类似unix的终端上,您可以尝试将ANSI escape sequences添加到文本中;
import time
import sys
print 'this is a text',
sys.stdout.flush()
time.sleep(1)
print '\x1b[80D'+'\x1b[K'+'Second text',
sys.stdout.flush()
字符'\ x1b'是转义字符。第一个序列将光标向上移动到左侧的80个位置。第二个清除线。
您需要在print语句末尾使用逗号以防止它转到第二行。然后,您需要刷新stdout
流,否则文本将不会出现。
编辑:为了将其与日志记录相结合,请将其包装在一个简单的函数中:
def mylog(text):
logging.info(text)
print '\x1b[80D' + '\x1b[K'+ text,
sys.stdout.flush()
编辑2:将其整合到标准日志记录中;
import logging
# create console handler
ch = logging.StreamHandler()
# create formatter
formatter = logging.Formatter('\x1b[80D\x1b[1A\x1b[K%(message)s')
# add formatter to console handler
ch.setFormatter(formatter)
# add console handler to logger
logger.addHandler(ch)
由于日志记录模块似乎自己添加了换行符,因此我添加了一个ANSI序列(\ x1b [1A]来上升一行。
另请参阅logging howto了解详情。