只显示一个记录行,删除以前的记录行

时间:2012-08-16 09:52:53

标签: python logging formatter

我有一个使用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输出。

有可能吗?

1 个答案:

答案 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了解详情。