簡體   English   中英

從 output 日志文件中排除 ANSI 轉義序列

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

然后我將它設置為特定FileHandlerFormatter程序。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM