Python Logging 模塊完全解讀

2021-03-02 Python中文社區

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

為什麼使用 logging?

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

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

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

為什麼?

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

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

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

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

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)))

列印出的日誌信息遵循默認格式: {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 配置為這些級別:

DEBUG:詳細信息,用於診斷問題。Value=10。

INFO:確認代碼運行正常。Value=20。

WARNING:意想不到的事情發生了,或預示著某個問題。但軟體仍按預期運行。Value=30。

ERROR:出現更嚴重的問題,軟體無法執行某些功能。Value=40。

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))



將日誌記入文件

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

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

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

如何更改 logging 格式

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

fig

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

import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s :: %(levelname)s :: %(message)s')

logging.info("噹噹當!")

不要對所有模塊使用 root logger

讓我們看下面的代碼:


import logging
logging.basicConfig(filename='module.log')




import logging
import myprojectmodule  

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__ 變量:

▼ 點擊成為社區註冊會員          「在看」一下,一起PY!

相關焦點

  • Python logging 模塊詳解
    Python logging 模塊定義了為應用程式和庫實現靈活的事件日誌記錄的函數和類。程序開發過程中,很多程序都有記錄日誌的需求,並且日誌包含的信息有正常的程序訪問日誌還可能有錯誤、警告等信息輸出,Python 的 logging 模塊提供了標準的日誌接口,可以通過它存儲各種格式的日誌,日誌記錄提供了一組便利功能,用於簡單的日誌記錄用法。
  • python中logging模塊詳解
    為什麼需要logging模塊用python寫代碼的時候,想看哪裡的輸出直接print就可以了。
  • Python之日誌處理(logging模塊)
    Logging 中幾種級別:DEBUG < INFO < WARNING < ERROR < CRITICALlogging模塊是python內置的標準模塊,主要用於輸出運行日誌,可以設置輸出日誌的等級、日誌保存路徑、日誌文件和回滾等;可以說,logging模塊主要由4部分組成:
  • 有了它,可以把Python裡Logging模塊扔掉了!
    logging 模塊,要實現既在終端輸出,又能寫文件,並且日誌文件還能 rotate ,代碼需要十多行:import loggingfrom logging.handlers import RotatingFileHandleros.makedirs('Logs', exists_ok=True)logger = logging.getLogger
  • python學習之日誌輸出格式logging.basicConfig函數的使用
    python的logging.basicConfig函數 ,使用時粘貼到用例前,就可以打log了。logging模塊是python內置的標準模塊,主要用於輸出運行日誌,可以設置輸出日誌的等級,日誌保存路徑,日誌文件回滾等日誌等級:(從低到高)debug:調試代碼用的,信息比較詳細info:輸出正確的信息,按照正常的代碼運行
  • Python的logging詳解
    Print不用的好好的麼,為什麼要用logging?因為調試時,print語句需要改動代碼,調試完你還得刪除掉,萬一忘記怎麼辦?還有線上代碼運行時你想知道當時發生了什麼,logging是最好的辦法。先看下logging的簡單用法:import logginglogging.basicConfig(level=logging.DEBUG)logger = logging.getLogger(__name__)logger.info('Start logging')msg = 'test'logger.debug('message: %s', msg)logger.info
  • python乾貨分享:使用logging記錄日誌信息
    Python中自帶的logging模塊提供了日誌功能,它將logger的level分為5個級別,可以通過Logger.setLevel(lvl)來設置,其中DEBUG為最低級別,CRITICAL為最高級別. 默認的級別為WARNING。
  • 淺談 Python 中的模塊
    模塊分類Python 中的模塊共分為三類,即內置模塊、第三方模塊、以及自定義模塊。random:用於生成隨機數time: 主要包含各種提供日期、時間功能的類和函數datetime:對 time 模塊的一個高級封裝logging:日誌處理re:用於實現正則匹配json:用於字符串和數據類型間進行轉換json1.2 第三方模塊
  • Python程式設計師進階之路:從新手到高手的100個模塊
    ,真實反映了 python 程式設計師在成長過程中的一些困惑。英漢小詞典pythoneer - 指所有用python語言開發程序的人pythonista - 意為資深的、追求質量和品味的python開發者本文所列舉的這100個模塊,是在工作和學習中用過的或者正在學習的,算是學習總結。希望對處在迷茫中的程式設計師有所幫助。
  • Python與SEO應用第二期
    一、講義說明本期培訓主要是面向想通過python來提高SEO工作效率的SEOer或者是對python爬蟲感興趣的目標人群。培訓的主要內容是學習如何通過python來開發各種SEO工具,以及python爬蟲的開發。
  • python的模塊和序列
    前言概要本章節主要講述python中的模塊和序列的概念以及如何使用模塊和序列化方面的知識。模塊的概念在python中有個關鍵詞是import,代表的是導入、加載的意思。通常import加載的模塊分為四個通用類別:使用python語言編寫的代碼(後綴名為py的文件)已被編譯為共享庫或DLL的C或C++的擴展使用C編寫並連接到python解釋器的內置模塊
  • Python之os模塊
    Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
  • Python的os / shutil / Path 模塊介紹
    Python中對文件、文件夾(文件操作函數)的操作需要涉及到os模塊和shutil模塊。
  • Python學習筆記:模塊和包
    模塊就是python程序,任何python程序都可作為模塊導入。對於任何程序,只要導入了模塊,即可使用該模塊內的所有成員。通常來說,我們應該將python的擴展模塊添加在 lib\site-packages 路徑下,它專門用於存放python的擴展模塊和包。
  • Python運維中常用的庫和模塊
    2、IPy(http://github.com/haypo/python-ipy),輔助IP規劃。3、dnspython(http://dnspython.org)Python實現的一個DNS工具包。4、difflib:difflib作為Python的標準模塊,無需安裝,作用是對比文本之間的差異。
  • python數據分析專題 (7):python數據分析模塊
    python是一門優秀的程式語言,而是python成為數據分析軟體的是因為python強大的擴展模塊。
  • python中的Requests模塊
    講解對象:python中的Requests模塊作者:融水公子 rsgz介紹:1 Requests 是一個第三方 Python 模塊2 Requests 唯一的一個非轉基因的apt-get update  #更新軟體列表2 安裝pip3執行命令:sudo apt-get install python3
  • Python的武器庫02:math模塊
    說到程式語言python,有一個著名的格言"餘生太短,只用python"。如果要分析為什麼會存在這麼一句格言?python的語法並不簡單,有複雜難懂的部分,之所以又這樣一句格言,是因為python中有很多強大的模塊,就像一個武器庫。
  • Python的武器庫07:sympy模塊
    說到程式語言python,有一個著名的格言"餘生太短,只用python"。如果要分析為什麼會存在這麼一句格言?python的語法並不簡單,有複雜難懂的部分,之所以有這樣一句格言,是因為python中有很多強大的模塊,就像一個武器庫。Python正式由於這些模塊的出現,只要引入這個模塊,調用這個模塊的集成函數,問題迎刃而解;不需要從頭開始,節省了大量的時間。
  • python命令參數及模塊的導入學習
    python已經成為程式語言排行榜的老大了,要向不被時代淘汰,就要緊跟時代步伐,在IT編程世界的今天,不會python可是不行的,今天繼續學習python的命令及相關模塊導入學習。import 與 from...import