Python 日誌格式化程式
我們使用日誌記錄來儲存有關程式執行的資訊。軟體執行時會出現各種警告,有時還會出現錯誤。通過日誌記錄儲存的資料有助於我們確定錯誤的原因。本文將討論我們如何使用 Python 中的日誌格式化程式以所需的格式儲存日誌資料。
Python 中有哪些不同的日誌記錄級別
日誌級別用於標識日誌檔案中警告或訊息的嚴重性。在 Python 中,我們有六個日誌記錄級別:critical
、error
、warning
、info
、debug
和 notset
。其中 critical
級別具有最高優先順序,而 notset
級別具有最低優先順序。通常,當我們在程式中建立日誌時,日誌會列印到標準輸出。我們可以使用 logging
模組中的 error()
方法列印 error
日誌。如下所示,error()
方法接受一個字串訊息並將其列印到標準輸出。
import logging
logging.error("This is a sample error message")
輸出:
ERROR:root:This is a sample error message
同樣,你可以使用 warning()
方法列印 warning
日誌,使用 debug()
方法列印 debug
日誌,使用 critical()
方法列印 critical
日誌和 info
日誌使用 info()
方法,如下所示。
import logging
logging.debug("This is a sample debug message")
logging.info("This is a sample info message")
logging.warning("This is a sample warning message")
logging.error("This is a sample error message")
logging.critical("This is a sample critical message")
輸出:
WARNING:root:This is a sample warning message
ERROR:root:This is a sample error message
CRITICAL:root:This is a sample critical message
在輸出中,root
是當前記錄器的名稱。我們還可以使用 getLogger()
方法定義記錄器。此外,你可以觀察到僅列印了 critical
、error
和 warning
日誌,而未列印 debug
和 info
日誌。
這是由於日誌級別設定為警告
級別的原因。任何低於 warning
級別的日誌,即 info
和 debug
日誌都不會被列印。要列印這些日誌,我們必須將日誌級別設定為 info
。為此,我們使用 logging
模組中定義的 setLevel()
方法。
setLevel()
方法在 logger
物件上呼叫。logger
物件是使用 logging
模組中定義的 getLogger()
方法建立的。getLogger()
方法將字串作為輸入。該字串被指定為記錄器的名稱。將日誌級別設定為確定級別後,將列印所有優先順序高於該級別的日誌。下面的例子展示了它是如何工作的。
import logging
logger = logging.getLogger("myLogger")
logger.setLevel(logging.CRITICAL)
logger.debug("This is a sample debug message")
logger.info("This is a sample info message")
logger.warning("This is a sample warning message")
logger.error("This is a sample error message")
logger.critical("This is a sample critical message")
輸出:
This is a sample critical message
在這裡,只列印 critical
日誌,因為我們已將日誌記錄級別定義為 critical
。此外,你可以看到只列印訊息,而不是日誌型別和 root
關鍵字。這是因為我們使用 getLogger()
函式定義了一個名為 myLogger
的自定義記錄器。要列印日誌型別和記錄器名稱,我們需要使用 python 日誌格式化程式。
什麼是 Python 日誌處理程式
簡單地將訊息列印到日誌檔案將不會產生有關錯誤的資訊。因此,我們需要格式化日誌訊息以從日誌檔案中獲取所需的資訊。為此,我們使用不同的日誌格式化程式和處理程式。
你可以將處理程式物件視為將日誌訊息傳送到其特定目的地的通道。有不同型別的處理程式物件,例如 FileHandler
和 StreamHandler
物件。FileHandler
物件是使用 FileHandler()
方法建立的。如下所示,它接受一個檔名作為輸入並返回一個 FileHandler
物件。
fileHandler = logging.FileHandler("test_file.log")
logger.addHandler(fileHandler)
類似地,使用 StreamHandler()
方法建立 StreamHandler
物件。FileHandler
物件將日誌定向到特定檔案,而 StreamHandler
物件將日誌定向到特定流。當我們不向 StreamHandler()
方法傳遞任何輸入引數時,它會將日誌定向到標準輸出流。你可以建立一個 StreamHandler
,如下所示。
streamHandler = logging.StreamHandler()
logger.addHandler(streamHandler)
建立處理程式物件後,我們使用 addHandler()
方法將處理程式新增到記錄器。addHandler()
方法是在 logger
物件上呼叫的,它將處理程式物件作為輸入引數。在執行 addHandler()
方法後,處理程式被新增到 logger
。
什麼是 Python 日誌格式化程式
Python 中的日誌格式化程式用於配置日誌的最終結構和內容。使用 python 日誌格式化程式,我們可以使用 % 運算子包括日誌名稱
、時間
、日期
、嚴重性
和其他資訊以及日誌訊息。
要定義日誌的格式,我們使用 Formatter()
方法。Formatter()
方法將包含不同屬性的字串作為輸入引數,例如 asctime
、name
、levelname
等。執行後,Formatter()
方法返回一個 Formatter
物件。
formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s: %(message)s")
這裡,
asctime
屬性表示建立日誌記錄的時間。name
屬性表示用於記錄呼叫的記錄器的名稱。levelname
屬性表示訊息的日誌記錄級別,例如除錯、資訊、警告、錯誤或嚴重。你可以在此處閱讀有關其他日誌屬性的更多資訊。
建立 Formatter
物件後,我們使用 setFormatter()
方法設定日誌的格式。setFormatter()
方法在處理程式物件上呼叫。我們使用 StreamHandler
將日誌列印到程式的標準輸出。在處理程式物件上呼叫時,setFormatter()
函式將 Formatter
物件作為輸入引數,並在處理程式中設定日誌格式。
streamHandler.setFormatter(formatter)
設定好日誌訊息的格式後,就可以像往常一樣記錄訊息,並按照定義的格式傳送到輸出流。
import logging
logger = logging.getLogger("myLogger")
streamHandler = logging.StreamHandler()
logger.addHandler(streamHandler)
formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s: %(message)s")
streamHandler.setFormatter(formatter)
logger.debug("This is a sample debug message")
logger.info("This is a sample info message")
logger.warning("This is a sample warning message")
logger.error("This is a sample error message")
logger.critical("This is a sample critical message")
輸出:
2021-12-28 02:33:42,933 myLogger WARNING: This is a sample warning message
2021-12-28 02:33:42,933 myLogger ERROR: This is a sample error message
2021-12-28 02:33:42,933 myLogger CRITICAL: This is a sample critical message
在這裡,你可以看到我們只使用 warning()
方法記錄了訊息。日誌以我們使用 Formatter()
方法定義的格式列印。它包含有關日誌的所有詳細資訊,例如建立日誌的日期和時間、記錄器的名稱和日誌型別。現在我們已經分塊學習了整個過程,我在下面提到了建立 python 日誌格式化程式以格式化日誌輸出的分步過程。
建立 Python 日誌格式化程式的步驟
-
使用
getLogger()
方法建立一個記錄器物件。 -
使用
FileHandler()
方法或StreamHandler()
方法建立一個FileHandler
或StreamHandler
物件。 -
使用
addHandler()
方法將FileHandler
或StreamHandler
物件新增到記錄器。 -
使用
Formatter()
方法建立一個 python 日誌格式化程式。 -
使用
FileHandler
或StreamHandler
物件上的setFormatter()
方法應用格式化程式。
まとめ
在本文中,我們討論了日誌記錄在 Python 中的工作原理。我們還討論了 Python 中的處理程式和日誌格式化程式。在本文中,我們使用 StreamHandler
物件和日誌格式化程式來演示格式化的工作原理。但是,你應該始終使用 FileHandler
物件來建立日誌,因為我們應該始終將日誌儲存在檔案中,以便在發生任何意外情況時檢查錯誤。此外,你可以使用本文中給出的許多其他日誌屬性來格式化日誌訊息以便更好地理解。
Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.
GitHub