Python Logging 模塊完全解讀

私信我,回覆:學習,獲取免費學習資源包。
Python Logging 模塊完全解讀


Python 中的 logging 模塊可以讓你跟蹤代碼運行時的事件,當程序崩潰時可以查看日誌並且發現是什麼引發了錯誤。Log 信息有內置的層級——調試(debugging)、信息(informational)、警告(warnings)、錯誤(error)和嚴重錯誤(critical)。你也可以在 logging 中包含 traceback 信息。不管是小項目還是大項目,都推薦在 Python 程序中使用 logging。本文將簡單清晰地介紹如何使用 logging 模塊。

為什麼使用 logging?

當你運行一個 Python 腳本時,你可能想要知道腳本的哪個部分在執行,並且檢視變量的當前值。

通常,可以只使用 print() 打印出你想要的信息。在小程序中,可能靠這個就足夠了。

但問題是,當你處理有很多個模塊的大項目時,就需要一個更加靈活的方法。

為什麼?

因為代碼需要經歷開發、調試、審查、測試或者上線等不同階段。在開發時你想要打印的信息類型可能和上線後你想看到的信息類型完全不同。

也就是說,在“測試”時,你可能只想看警告和錯誤信息,然而在“調試”時,你可能還想看到跟調試相關的信息。

如果你還想打印出使用的模塊以及代碼運行的時間,那麼你的代碼很容易變得混亂。

使用 logging 模塊,這些問題就能很容易地解決。

logging 模塊可以:

  1. 控制信息層級,僅記錄需要的信息。
  2. 控制顯示或者保存日誌的時機。
  3. 使用內置信息模板控制日誌格式。
  4. 知曉信息來自於哪個模塊。
Python Logging 模塊完全解讀

基本 logging 例子

logging 模塊是 Python 的標準庫,要使用 logging,只需要使用 logging.basicConfig() 進行基本設置。事實上,這也是可選的。

然後就可以調用 logging.{level}(message) 在控制檯中顯示信息。

import logging
logging.basicConfig(level=logging.INFO)
def hypotenuse(a, b):
 """計算三角形斜邊"""
 return (a**2 + b**2)**0.5
logging.info("{a}, {b} 的斜邊是 {c}".format(a=3, b=4, c=hypotenuse(a=3, b=4)))
#> INFO:root:3, 4 的斜邊是 5.0

打印出的日誌信息遵循默認格式: {LEVEL}:{LOGGER}:{MESSAGE}。

上面的例子中, LEVEL 就是 INFO,因為調用的是 logging.info()。

LOGGER 為 root,因為這是默認 logger。

logger(日誌記錄器)類似於一個實體,你可以創建並配置它來記錄不同類型和格式的消息。

你可以配置一個輸出到控制檯的 logger 和另一個將日誌發送到文件的 logger,它們具有不同的日誌記錄級別,並且特定於給定模塊。

最後,輸出的信息就是我傳遞給 logging.info() 的字符串。

那麼如果不設置 logging.basicConfig(level=logging.INFO) 會怎麼樣?

答案是

日誌信息不會被打印出來

為什麼?要知道這個需要先了解 logging 的級別。

logging 的 5 個級別

logging 有 5 個不同層次的日誌級別,可以將給定的 logger 配置為這些級別:

  1. DEBUG:詳細信息,用於診斷問題。Value=10。
  2. INFO:確認代碼運行正常。Value=20。
  3. WARNING:意想不到的事情發生了,或預示著某個問題。但軟件仍按預期運行。Value=30。
  4. ERROR:出現更嚴重的問題,軟件無法執行某些功能。Value=40。
  5. CRITICAL:嚴重錯誤,程序本身可能無法繼續運行。Value=50。

現在,讓我們回答之前提出的問題。默認 logger 是 root,其默認的 basicConfig 級別是 WARNING。也就是說,只有來自 logging.warning或者更高級別的信息才會被記錄下來。

因此,logging.info() 中的信息不會被打印出來。這也是為什麼 basicConfig 被設為 INFO。

如果級別使用 logging.ERROR 代替,只有來自 logging.error 和 logging.critical 的信息會被記錄。

import logging
logging.basicConfig(level=logging.ERROR)
def hypotenuse(a, b):
 """計算三角形斜邊"""
 return (a**2 + b**2)**0.5
kwargs = {'a':3, 'b':4, 'c':hypotenuse(3, 4)}
logging.debug("a = {a}, b = {b}".format(**kwargs))
logging.info("{a}, {b} 的斜邊是 {c}".format(**kwargs))
logging.warning("a={a} 和 b={b} 相等".format(**kwargs))
logging.error("a={a} 和 b={b} 不能為負".format(**kwargs))
logging.critical("{a}, {b} 的斜邊是 {c}".format(**kwargs))
#> ERROR:root:a=3 和 b=4 不能為負
#> CRITICAL:root:3, 4 的斜邊是 5.0

將日誌記入文件

要從 root logger 將日誌消息發送到文件,需要在 logging.basicConfig() 中設置 file 參數:

import logging
logging.basicConfig(level=logging.INFO, filename='sample.log')

現在,所有後續日誌消息都將直接記錄到當前工作目錄中的“sample.log“文件。如果要將其記錄到另一個目錄中的文件,請給出完整的文件路徑。

如何更改 logging 格式

logging 模塊提供了向日志消息添加各種詳細信息的速記表。


Python Logging 模塊完全解讀


fig

讓我們更改日誌信息格式以顯示 TIME、LEVEL 和 MESSAGE。

import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s :: %(levelname)s :: %(message)s')
logging.info("噹噹噹!")
#> 2019-03-10 19:41:09,057 :: INFO :: 噹噹噹!
Python Logging 模塊完全解讀

不要對所有模塊使用 root logger

讓我們看下面的代碼:

# 1. myprojectmodule.py
import logging
logging.basicConfig(filename='module.log')
#-----------------------------
# 2. main.py (從 myprojectmodule.py 導入代碼)
import logging
import myprojectmodule # 運行 myprojectmodule.py 中的代碼,將生成 `module.log` 文件
logging.basicConfig(filename='main.log') # 無效!
 

如果項目中有一個或多個模塊。這些模塊使用基本根模塊。然後,當導入模塊 myprojectmodule.py 時,將運行該模塊的所有代碼並配置 logger。

一旦配置好,main 文件中的 root logger 將不能再更改 root logger 設置。因為,一旦設置好 logging.basicConfig(),就不能再更改它。

如果想在不同文件中使用不同 logger,就需要創建一個新的 logger。

如何創建一個新的 logger?

可以使用 logger.getLogger(name) 方法創建一個新的 logger。

如果存在同名的 logger,則將使用該 logger。

可以給 logger 取任何名字,但是通常使用 __name__ 變量。

來源網絡,侵權聯繫刪除

私信我,回覆:學習,獲取免費學習資源包。


分享到:


相關文章: