【ChatGPT系列】Python自定義打印各種顏色的日誌

[本文出自天外歸雲的博客園]

如何在控制檯和文件中同時輸出日誌?

要將日誌同時輸出到文件和控制檯,可以創建並配置一個額外的 StreamHandler,然後將其添加到 Logger 中。下面是一個示例代碼,演示如何將日誌同時輸出到文件和控制檯:

import logging

# 創建 Logger 對象
logger = logging.getLogger("example_logger")
logger.setLevel(logging.DEBUG)

# 創建 FileHandler 並設置 Formatter
file_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s", "%Y-%m-%d %H:%M:%S")
file_handler = logging.FileHandler("example.log")
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(file_formatter)

# 創建 StreamHandler 並設置 Formatter
console_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s", "%Y-%m-%d %H:%M:%S")
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(console_formatter)

# 將 FileHandler 和 StreamHandler 添加到 Logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# 示例日誌記錄
logger.debug("This is a debug message.")
logger.info("This is an info message.")
logger.warning("This is a warning message.")
logger.error("This is an error message.")
logger.critical("This is a critical message.")

在上述示例中,我們創建了一個名爲 `console_handler` 的 StreamHandler,並設置了適當的 Formatter。然後,我們將 `console_handler` 添加到 Logger 中,以便將日誌記錄發送到控制檯。

這樣設置後,日誌消息將同時輸出到文件(使用 FileHandler)和控制檯(使用 StreamHandler)。

你可以根據自己的需求自定義日誌處理程序的級別和格式。例如,可以使用 `console_handler.setLevel(logging.DEBUG)` 設置控制檯的日誌級別爲 DEBUG,以確保所有級別的日誌消息都輸出到控制檯。

如何讓這五種level的日誌顯示不同的顏色?

要爲不同級別的日誌消息添加不同的顏色,可以使用 `logging` 模塊的 `addHandler()` 方法添加一個自定義的處理程序,該處理程序將根據日誌級別爲消息選擇不同的顏色。下面是一個示例代碼,演示如何爲不同級別的日誌消息設置不同的顏色:

import logging
import sys


# 自定義處理程序,根據日誌級別選擇不同的顏色
class ColoredHandler(logging.StreamHandler):
  def emit(self, record):
    # 定義不同級別的顏色代碼
    colors = {
        logging.DEBUG: '\033[94m', # 藍色
        logging.INFO: '\033[92m', # 綠色
        logging.WARNING: '\033[93m', # 黃色
        logging.ERROR: '\033[91m', # 紅色
        logging.CRITICAL: '\033[95m' # 紫色
    }

# 重置終端顏色代碼
reset_color = '\033[0m'

# 獲取日誌級別對應的顏色代碼
color = colors.get(record.levelno, '')

# 格式化消息並輸出到控制檯
self.stream.write(color + self.format(record) + reset_color + '\n')


# 創建 Logger 對象
logger = logging.getLogger("example_logger")
logger.setLevel(logging.DEBUG)

# 創建自定義處理程序並設置格式
handler = ColoredHandler(sys.stdout)
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s", "%Y-%m-%d %H:%M:%S")
handler.setFormatter(formatter)

# 將處理程序添加到 Logger
logger.addHandler(handler)

# 示例日誌記錄
logger.debug("This is a debug message.")
logger.info("This is an info message.")
logger.warning("This is a warning message.")
logger.error("This is an error message.")
logger.critical("This is a critical message.")

在上述示例中,我們創建了一個自定義的 `ColoredHandler` 類,繼承自 `StreamHandler`。在 `ColoredHandler` 中,我們重寫了 `emit()` 方法,根據日誌級別選擇相應的顏色代碼,並將格式化後的消息輸出到控制檯。

我們定義了一個 `colors` 字典,將不同級別的日誌與相應的顏色代碼關聯起來。然後,我們在 `emit()` 方法中根據日誌記錄的級別獲取相應的顏色代碼,並將其應用於輸出的消息。

在示例中,我們使用藍色、綠色、黃色、紅色和紫色分別表示 DEBUG、INFO、WARNING、ERROR 和 CRITICAL 級別的日誌消息。

運行示例代碼後,不同級別的日誌消息將以不同的顏色顯示在控制檯上。請確保你的終端支持 ANSI 轉義序列,以正確顯示顏色。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章