在 Python 中將訊息記錄到檔案和控制檯
-
在 Python 中使用
logging
模組向檔案和控制檯列印日誌資訊 -
在 Python 中使用
logging
模組向檔案和控制檯列印日誌資訊 -
在 Python 中使用
logging
模組將日誌訊息列印到檔案
本教程將介紹一些在 Python 中將除錯字串記錄到檔案和控制檯的方法。
在 Python 中使用 logging
模組向檔案和控制檯列印日誌資訊
日誌記錄是記錄系統中發生的各種事件的過程。這些事件可以是輸入資料、程序、執行緒、輸出資料、處理過的資訊、錯誤、警告、通知。各種事件被跟蹤並儲存在日誌檔案中。logging
模組由 Python 提供,便於程式設計師記錄發生的各種事件。該模組具有特定的類和方法。Loggers
、Handlers
、Filters
和 Formatters
是 logging
模組定義的基本類。
basicConfig()
方法執行基本配置。它使用預設的 Formatter
建立一個 StreamHandler
。然後,它新增到根記錄器。日誌記錄級別以數值表示。有六個日誌記錄級別:CRITICAL
、ERROR
、WARNING
、INFO
、DEBUG
和 NOTSET
。我們已將日誌記錄級別設定為下方的 INFO
。因此,將顯示或儲存 INFO
、WARNING
、ERROR
和 CRITICAL
。
要寫入控制檯和檔案,我們將使用 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