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

Rug*_*rra 6 python logging formatter

我有一个程序使用logging模块和print语句.例如,日志记录是告知用户程序正在做什么

logging.info("downloading HTML")
time.sleep(1)
logging.info("parsing HTML")
time.sleep(1)
print "the result"
Run Code Online (Sandbox Code Playgroud)

最后屏幕上的输出(混合stdout和stderr)将是:

INFO:downloading HTML
INFO:parsing HTML
the result
Run Code Online (Sandbox Code Playgroud)

我想在显示下一个日志记录输出或调用打印时隐藏最后一个日志记录输出.例如,启动程序,您将看到:

INFO:download HTML
Run Code Online (Sandbox Code Playgroud)

等一下,下一个信息"parsing HTML"将替换上一个"downloading HTML",所以在屏幕上你只会看到:

INFO:parsing HTML
Run Code Online (Sandbox Code Playgroud)

之前别无其他,等一秒,我只想在屏幕上看到:

"the result"
Run Code Online (Sandbox Code Playgroud)

我只想在登录stderr时想要这个功能,而不是在登录文件时,例如,我希望看到所有logging输出.

可能吗?

Rol*_*ith 8

在类似unix的终端上,您可以尝试将ANSI转义序列添加到文本中;

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()
Run Code Online (Sandbox Code Playgroud)

字符'\ x1b'是转义字符.第一个序列将光标向上移动到左侧的80个位置.第二个清除线.

您需要在print语句末尾使用逗号以防止它转到第二行.然后你需要刷新stdout流,否则文本将不会出现.

编辑:为了将其与日志记录相结合,请将其包装在一个简单的函数中:

def mylog(text):
    logging.info(text)
    print '\x1b[80D' + '\x1b[K'+ text,
    sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

编辑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)
Run Code Online (Sandbox Code Playgroud)

由于日志记录模块似乎自己添加换行符,我添加了一个ANSI序列(\ x1b [1A]上升一行.

另请参阅日志记录以获取更多信息.