[英]Exclude ANSI escape sequences from output log file
我已经设置了 class 颜色,以便在出现警告时更易于阅读标准输出。 我还想将所有打印语句写入日志文件。
# Colour set up
class colours:
warning = '\033[93m'
colour1 = '\033[94m'
colour2 = '\033[1m'
terminate = '\033[0m'
# Logger set up
class Logger(object):
def __init__(self):
self.terminal = sys.stdout
self.log = open(“output.log”, "a")
def write(self, message):
self.terminal.write(message)
self.log.write(message)
sys.stdout = Logger()
# Example
print colours.warning + ‘WARNING!’ + colours.terminate
*in colour*:$ WARNING!
*in output.log*: [93mWARNING!
有什么方法可以写入也会为 output.log 文件着色的字符,或者以彩色打印到标准输出但不在日志文件中包含“[94m”? 为了方便用户,我不想要求安装任何非本地 python 包。
在写入output.log
对象时,使用\\x1b\\[[0-9;]*m
这样的正则表达式来\\x1b\\[[0-9;]*m
ANSI代码吗?
即
import re
ansi_re = re.compile(r'\x1b\[[0-9;]*m')
# ...
self.log.write(re.sub(ansi_re, '', message))
我知道,这是一个旧线程,但我想将我改进的(在我看来)@AKX 解决方案留给其他人。
为了自动化日志记录时所做的事情,即re.sub(...)
可以创建一个自定义格式化程序。
class TermEscapeCodeFormatter(logging.Formatter):
"""A class to strip the escape codes from the """
def __init__(self, fmt=None, datefmt=None, style='%', validate=True):
super().__init__(fmt, datefmt, style, validate)
def format(self, record):
escape_re = re.compile(r'\x1b\[[0-9;]*m')
record.msg = re.sub(escape_re, "", str(record.msg))
return super().format(record)
然后我将它设置为特定FileHandler
的Formatter
程序。
def main():
lger = logging.getLogger("test_hw")
lger.setLevel(logging.INFO)
stdo = logging.StreamHandler()
stdo.setLevel(logging.INFO)
fhdr = logging.FileHandler("fname.txt", "w")
fhdr.setLevel(logging.INFO)
fmer = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
stdo.setFormatter(fmer)
cfmer = TermEscapeCodeFormatter('%(asctime)s - %(levelname)s - %(message)s')
fhdr.setFormatter(cfmer)
lger.addHandler(stdo)
lger.addHandler(fhdr)
现在可以使用一个带颜色的记录器(我使用Colorama )到 output 到标准输出,启用 colors 并禁用它们进行归档。
lger.info(f"value = {Style.BRIGHT}{value :>5.2f} V{Style.RESET_ALL}")
在此版本中仅适用于 ANSI 终端,但可以调整正则表达式以匹配其他模式。
根据最新(我相信是 3.10)Python 版本,没有defaults
关键字参数。 我用的是3.8。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.