在 Python 中將訊息記錄到檔案和控制檯

Subodh Adhikari 2023年10月10日
  1. 在 Python 中使用 logging 模組向檔案和控制檯列印日誌資訊
  2. 在 Python 中使用 logging 模組向檔案和控制檯列印日誌資訊
  3. 在 Python 中使用 logging 模組將日誌訊息列印到檔案
在 Python 中將訊息記錄到檔案和控制檯

本教程將介紹一些在 Python 中將除錯字串記錄到檔案和控制檯的方法。

在 Python 中使用 logging 模組向檔案和控制檯列印日誌資訊

日誌記錄是記錄系統中發生的各種事件的過程。這些事件可以是輸入資料、程序、執行緒、輸出資料、處理過的資訊、錯誤、警告、通知。各種事件被跟蹤並儲存在日誌檔案中。logging 模組由 Python 提供,便於程式設計師記錄發生的各種事件。該模組具有特定的類和方法。LoggersHandlersFiltersFormatterslogging 模組定義的基本類。

basicConfig() 方法執行基本配置。它使用預設的 Formatter 建立一個 StreamHandler。然後,它新增到根記錄器。日誌記錄級別以數值表示。有六個日誌記錄級別:CRITICALERRORWARNINGINFODEBUGNOTSET。我們已將日誌記錄級別設定為下方的 INFO。因此,將顯示或儲存 INFOWARNINGERRORCRITICAL

要寫入控制檯和檔案,我們將使用 logging.basicConfig(),它可以採用引數處理程式並大大簡化日誌記錄設定,尤其是在使用相同的格式化程式設定多個處理程式時。我們使用 FileHandler() 方法寫入檔案並使用 debug.log 記錄所有資訊。同樣,要寫入控制檯,我們使用 StreamHandler()。預設情況下,StreamHandler() 寫入標準錯誤。要寫入標準輸出,我們匯入 sys 模組並將 sys.stdout 顯式傳遞給 StreamHandler()

在下面的示例中,日誌列印在控制檯和檔案 debug.log 中。

# python 3.x
import logging
import sys

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[logging.FileHandler("debug.log"), logging.StreamHandler(sys.stdout)],
)
logging.debug("This message is skipped as a level is set as INFO")
logging.info("So should this")
logging.warning("And this, too")
logging.error("Testing non-ASCII character, Ø and ö")

輸出:

2021-07-28 14:50:01,348 [INFO] So should this
2021-07-28 14:50:01,349 [WARNING] And this, too
2021-07-28 14:50:01,349 [ERROR] Testing non-ASCII character, Ø and ö

在 Python 中使用 logging 模組向檔案和控制檯列印日誌資訊

要使用日誌記錄並設定基本配置,我們使用 logging.basicConfig()。然後,我們不使用 print(),而是呼叫 logging.{level}(message) 在控制檯中顯示訊息。由於我們在 basicConfig() 設定中將級別配置為 INFO,我們稍後在程式中呼叫了 logging.info()。並將字串中的整個訊息傳遞給 logging.info(),然後將其顯示到控制檯。

示例程式碼:

# python 3.x
import logging

logging.basicConfig(level=logging.INFO)


def area(l, b):
    """Compute the area of a rectangle"""
    return l * b


logging.info(
    "Area of length: {l} and breadth: {b} is {c}".format(l=3, b=4, c=area(l=3, b=4))
)

輸出:

INFO:root:Area of length: 3 and breadth: 4 is 12

在 Python 中使用 logging 模組將日誌訊息列印到檔案

如果我們在一個程式中使用多個模組,那麼使用根模組有很大的侷限性。這就是為什麼我們需要使用 logger.getLogger(name) 方法建立一個新的記錄器。

有使用 __name__ 變數作為記錄器名稱的約定。一旦我們建立了一個新的記錄器,我們應該記住使用新的 logger.info() 而不是根的 logging.info() 方法來記錄我們的所有訊息。FileHandler() 用於使我們的自定義記錄器登入到不同的檔案。在這裡,我們將我們的資訊記錄到 logfile.log。同樣,Formatter() 用於更改我們記錄的訊息的格式。Formatter 設定在 FileHandler 物件上,而不是直接設定在記錄器上。

例如,使用 getLogger() 來建立或獲取記錄器。然後,使用 setLogger() 方法設定日誌級別。將級別設定為 logging.WARNING。接下來,使用 FileHandler() 方法定義處理程式,使用 Formatter() 方法設定格式化程式。然後,使用 addHandler() 方法將處理程式新增到記錄器。最後,寫一些訊息進行測試。我們可以在檔案 log_file.log 中看到日誌。

示例程式碼:

# python 3.x
import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
handler = logging.FileHandler("log_file.log")
formatter = logging.Formatter(
    "%(asctime)s : %(name)s  : %(funcName)s : %(levelname)s : %(message)s"
)
handler.setFormatter(formatter)
logger.addHandler(handler)

logger.debug("A debug message")
logger.info("An info message")
logger.warning("There is something wrong")
logger.error("An error has happened.")
logger.critical("Fatal error occured. Cannot continue")

輸出:

2021-07-30 11:55:31,047 : __main__  : <module> : WARNING : There is something wrong
2021-07-30 11:55:31,047 : __main__  : <module> : ERROR : An error has happened.
2021-07-30 11:55:31,047 : __main__  : <module> : CRITICAL : Fatal error occured. Cannot continue

相關文章 - Python Logging