在 Python 撰寫程式時,我們會希望螢幕 stdout 輸出可以同時記錄到 log 檔案裡。
但是螢幕輸出可能含有 ASCII escape codes 的顏色資訊,輸出的 log 檔案會有類似 ^[[01;32m 這種字樣出現。
我採用比較簡單的解法:
也就是將 sys.stdout 指向自定義的 PrintLog class,讓 PrintLog 來處理輸出文字,用完 PrintLog 後再把 sys.stdout 導向回原本的 stdout。
接著使用 sed 指令刪除 log.txt 的 ASCII escape code:
上面的正規,\x 後面用來接一個 16 進位 ASCII 編碼,其中 1b 代表的是 ESC 退出鍵。
到此即可獲得沒有顏色編碼的 log.txt 純文字檔案了。
但是螢幕輸出可能含有 ASCII escape codes 的顏色資訊,輸出的 log 檔案會有類似 ^[[01;32m 這種字樣出現。
我採用比較簡單的解法:
- 先將 print 函式輸出的訊息,同時導向到螢幕,同時儲存在指定的 log.txt 檔案中。
- 再用 sed 指令,將 log.txt 內的 ASCII escape code 清除。
方法如下:
import sys class PrintLog(object): def __init__(self): self.console = sys.stdout self.log_file = open("log.txt", "w") def write(self, msg): self.console.write(msg) self.log_file.write(msg) def flush(self): pass def main(): original_stdout = sys.stdout sys.stdout = PrintLog() print " This is a testing message." sys.stdout = original_stdout if(__name__ == "__main__"): main()
也就是將 sys.stdout 指向自定義的 PrintLog class,讓 PrintLog 來處理輸出文字,用完 PrintLog 後再把 sys.stdout 導向回原本的 stdout。
接著使用 sed 指令刪除 log.txt 的 ASCII escape code:
sed -i 's/\x1b[^m]*m//g' ./log.txt
上面的正規,\x 後面用來接一個 16 進位 ASCII 編碼,其中 1b 代表的是 ESC 退出鍵。
到此即可獲得沒有顏色編碼的 log.txt 純文字檔案了。
Hi there,
回覆刪除this is a very good blog I appreciate your work. thanks for sharing such a useful information.
Visit my blog
Hii,
回覆刪除Great Article.Thnks for sharing .I have been searching for such an informative post since many days and it seems my search jst ended here.Good work.Keep posting. You should also try this.
Mahadev Book