[英]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.