Python 仅显示一条记录行,删除以前的记录行
我有一个使用Python 仅显示一条记录行,删除以前的记录行,python,logging,formatter,Python,Logging,Formatter,我有一个使用日志记录模块和打印语句的程序。例如,日志记录是通知用户程序正在做什么 logging.info("downloading HTML") time.sleep(1) logging.info("parsing HTML") time.sleep(1) print "the result" 最后,屏幕上的输出(混合标准输出和标准输出)将为: 我想在显示下一个日志输出或调用打印时隐藏上一个日志输出。例如,启动程序,您将看到: INFO:download HTML 等待一秒钟,下一个信息
日志记录
模块和打印
语句的程序。例如,日志记录是通知用户程序正在做什么
logging.info("downloading HTML")
time.sleep(1)
logging.info("parsing HTML")
time.sleep(1)
print "the result"
最后,屏幕上的输出(混合标准输出和标准输出)将为:
我想在显示下一个日志输出或调用打印时隐藏上一个日志输出。例如,启动程序,您将看到:
INFO:download HTML
等待一秒钟,下一个信息“解析HTML”
将替换上一个“下载HTML”
,因此在屏幕上您将只看到:
INFO:parsing HTML
之前什么都不做,等一下,我只想在屏幕上看到:
"the result"
我只希望在登录到stderr时使用此功能,而不希望在登录到文件时使用此功能。例如,在那里,我希望看到所有日志记录
输出
有可能吗?在类似unix的终端上,您可以尝试在文本前加前缀
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)以增加一行
有关更多信息,请参见。没有多大意义,因为这样的行为只能处理(如果有的话)通过控制台处理程序。由于日志调用被委托给已注册的处理程序列表,因此没有通用的方法来执行此操作。您想在此处滥用日志模块。不,写入标准输出是单向的,无法收回您所写入的内容。但是,您可以将终端设置为仅显示一行。@Dikei:您是对的,但您可以更改屏幕上打印的内容,例如使用
'\r'
@Maulwurfn:new handler?对不起,我不是专家,您可能想了解一下。我没有这方面的经验,但我在相关问题中听说过。谢谢,但重点是我想将其集成到日志记录
模块中,是的,我能够做到这一点,关键是我想使用日志模块将其集成,假设我使用了高级功能,如格式化程序、自定义级别等。此外,函数的第一行是无用的,您可以删除它,您没有使用日志记录模块。最后,我不想更改代码,只定义一个ne您只需向流处理程序添加新的格式化程序。请参阅编辑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)