Python?logging日志模塊的概念與實(shí)踐講解
一、Python 日志模塊簡介
日志的概念及其在軟件開發(fā)中的作用
在開發(fā)過程中,為了記錄應(yīng)用程序的運(yùn)行情況,通常我們會采用打印日志的方式,這種方式不僅可以幫助我們了解軟件系統(tǒng)的運(yùn)行狀態(tài),還可以在系統(tǒng)出現(xiàn)錯誤時,幫助我們快速定位問題。
例如,假設(shè)你有以下一段代碼,它只是簡單地輸出一些信息:
print("This is some information.")
輸出:
This is some information.
但是,如果我們需要記錄更復(fù)雜的信息,如錯誤信息、警告或者其他重要的運(yùn)行時信息,僅僅使用print就顯得力不從心。這就是我們需要日志模塊的地方。
Python logging日志模塊簡介
Python內(nèi)置的logging模塊為我們提供了一套完整的日志記錄解決方案。在許多情況下,你可能希望你的應(yīng)用程序能夠在運(yùn)行時輸出某種形式的狀態(tài)信息,特別是當(dāng)應(yīng)用程序需要處理長時間運(yùn)行的任務(wù),或者當(dāng)你面臨需要診斷的問題時,logging模塊便是你的得力助手。
logging模塊可以幫助我們捕獲、處理和記錄日志信息,使得我們可以在程序運(yùn)行的任何地方快速記錄日志信息。相比于簡單的print函數(shù),它更具有靈活性,能夠同時輸出日志到多個地方,如:控制臺、文件、HTTP GET/POST,SMTP,Socket等,并且可以獨(dú)立設(shè)置每個輸出的日志等級。
以下是一個簡單的例子來說明如何使用logging模塊:
import logging # Create a logger and set the log level to INFO logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # Add a StreamHandler to send log messages to console console_handler = logging.StreamHandler() logger.addHandler(console_handler) # Log an informational message logger.info("This is an informational message.")
這段代碼會輸出以下信息到控制臺:
This is an informational message.
logging模塊的基本組成
logging模塊主要由以下幾個部分組成:
Logger: 用于提供應(yīng)用程序直接使用的接口。
Handler: 將(logger產(chǎn)生的)日志記錄發(fā)送到合適的目的輸出。
Filter: 提供了更精細(xì)的工具來決定輸出哪些日志記錄。
Formatter: 指定日志記錄的最終輸出格式。
二、logging日志模塊詳解
logging的基礎(chǔ)使用
使用Python的logging模塊相當(dāng)簡單,下面是一個基本的例子,說明如何創(chuàng)建一個日志并輸出到控制臺。
import logging # This will log the message to the console logging.warning('This is a warning message')
這段代碼將輸出以下警告信息:
WARNING:root:This is a warning message
理解日志級別
在logging模塊中,我們有5個級別來描述日志的重要性。這些級別分別是:
DEBUG:詳細(xì)信息,通常僅在診斷問題時使用。
INFO:確認(rèn)事情按預(yù)期進(jìn)行。
WARNING:出現(xiàn)了一些預(yù)期之外的事情,或者在不久的將來可能出現(xiàn)問題(例如,“磁盤空間不足”)。但是軟件仍在正常工作。
ERROR:由于更嚴(yán)重的問題,軟件不能執(zhí)行某些功能。
CRITICAL:嚴(yán)重的錯誤,表明程序本身可能無法繼續(xù)運(yùn)行。
默認(rèn)情況下,logging模塊將日志記錄到控制臺,并且只處理級別為WARNING以上的日志。
Loggers、Handlers和Formatters
這一部分我們將會詳解Loggers、Handlers和Formatters這三個主要組件。
Loggers的作用和使用
Logger是一個日志對象,主要任務(wù)就是記錄日志。在應(yīng)用程序代碼中任何需要日志的地方,都可以創(chuàng)建一個logger實(shí)例,并用其記錄需要的信息。下面是一個簡單的使用logger的例子:
import logging # Create a logger logger = logging.getLogger(__name__) # Log some messages logger.debug("This is a debug message.") logger.info("This is an informational message.") logger.warning("Careful! Something does not look right.") logger.error("You have encountered an error.") logger.critical("The program cannot recover from this situation!")
注意:當(dāng)我們運(yùn)行這段代碼時,我們并沒有看到任何輸出。這是因?yàn)槟J(rèn)情況下,logger的級別設(shè)置為WARNING,因此只有級別為WARNING以上的日志會被處理。
Handlers的種類和作用
Handler對象負(fù)責(zé)發(fā)送日志記錄到合適的目的地。不同的handler可以將日志發(fā)送到控制臺,文件,郵件,甚至HTTP POST參數(shù)等。下面是一個簡單的例子,說明如何使用handler將日志記錄到文件和控制臺:
import logging # Create a logger logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # Create a file handler file_handler = logging.FileHandler('my_log.log') logger.addHandler(file_handler) # Create a console handler console_handler = logging.StreamHandler() logger.addHandler(console_handler) # Log some messages logger.debug("This is a debug message.") logger.info("This is an informational message.") logger.warning("Careful! Something does not look right.") logger.error("You have encountered an error.") logger.critical("The program cannot recover from this situation!")
Formatters的功能和自定義日志格式
Formatter對象指定日志記錄的最終順序,結(jié)構(gòu)和內(nèi)容。你可以自定義日志信息的格式,使得日志信息更具有可讀性。下面是一個如何使用formatter的例子:
import logging # Create a logger logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # Create a console handler console_handler = logging.StreamHandler() # Create a formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # Add the formatter to the console handler console_handler.setFormatter(formatter) # Add the console handler to the logger logger.addHandler(console_handler) # Log some messages logger.debug("This is a debug message.") logger.info("This is an informational message.") logger.warning("Careful! Something does not look right.") logger.error("You have encountered an error.") logger.critical("The program cannot recover from this situation!")
三、Python日志模塊在實(shí)踐中的應(yīng)用
使用日志記錄異常信息
在Python編程中,經(jīng)常需要捕獲和處理異常。這時,使用logging模塊記錄異常信息會非常方便。在logging模塊中,我們可以使用exception()方法記錄異常堆棧信息。如下例所示:
import logging logger = logging.getLogger(__name__) try: a = [1, 2, 3] value = a[3] except IndexError as e: logger.error("Unhandled exception", exc_info=True) ``` 當(dāng)運(yùn)行此段代碼,日志記錄器將記錄下出現(xiàn)的異常信息,如下: ```python ERROR:__main__:Unhandled exception Traceback (most recent call last): File "<stdin>", line 4, in <module> IndexError: list index out of range
使用RotatingFileHandler進(jìn)行日志滾動
當(dāng)我們的應(yīng)用程序運(yùn)行很長時間,并產(chǎn)生大量的日志時,所有的日志都寫入一個文件可能會導(dǎo)致這個日志文件過大。這時,我們可以使用RotatingFileHandler來進(jìn)行日志滾動。當(dāng)達(dá)到一定的大小或者一定的時間,RotatingFileHandler會自動備份當(dāng)前日志文件,并創(chuàng)建一個新的日志文件繼續(xù)寫入。如下例所示:
import logging from logging.handlers import RotatingFileHandler logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # Create a file handler handler = RotatingFileHandler('my_log.log', maxBytes=2000, backupCount=10) logger.addHandler(handler) # Log some messages for _ in range(10000): logger.info("Hello, world!") ``` ##這段代碼將在日志文件大小達(dá)到2000字節(jié)時創(chuàng)建一個新的日志文件,并保留最新的10個日志文件。 ## 配置日志級別 ##根據(jù)我們的需要,可以在運(yùn)行時改變?nèi)罩镜募墑e。例如,當(dāng)我們在調(diào)試應(yīng)用程序時,我們可能需要輸出所有級別的日志。但是在生產(chǎn)環(huán)境中,我們可能只關(guān)心錯誤及以上級別的日志。我們可以通過setLevel()函數(shù)來改變?nèi)罩炯墑e。如下例所示: ```python import logging # Create a logger logger = logging.getLogger(__name__) # Set log level to DEBUG logger.setLevel(logging.DEBUG) # Log some messages logger.debug("This is a debug message.") logger.info("This is an informational message.") logger.warning("Careful! Something does not look right.") logger.error("You have encountered an error.") logger.critical("The program cannot recover from this situation!")
四、Python日志模塊的最佳實(shí)踐
在模塊級別使用__name__創(chuàng)建logger
在Python中,__name__變量是一個內(nèi)置變量,它代表當(dāng)前模塊的名稱。當(dāng)我們在每個模塊級別上創(chuàng)建logger并使用__name__作為名稱,我們可以輕松地追蹤日志記錄發(fā)生在哪個模塊。
import logging # Create a logger at the module level logger = logging.getLogger(__name__)
使用合適的日志級別
不同的日志級別表示了不同的嚴(yán)重性。正確地使用日志級別可以幫助我們在大量的日志中找到我們關(guān)心的信息。一般來說,對于非常嚴(yán)重的錯誤,我們應(yīng)使用CRITICAL或ERROR;對于警告信息,我們應(yīng)使用WARNING;對于常規(guī)的運(yùn)行信息,我們應(yīng)使用INFO;對于調(diào)試信息,我們應(yīng)使用DEBUG。
使用結(jié)構(gòu)化的日志消息
當(dāng)我們的應(yīng)用程序有大量的日志時,我們可能希望以一種可解析的方式記錄日志消息。例如,我們可以使用JSON格式記錄日志。這樣,我們就可以使用各種日志分析工具分析日志。
import logging import json # Create a logger logger = logging.getLogger(__name__) # Log a structured message logger.info(json.dumps({ 'action': 'User login', 'username': 'user123', 'ip_address': '123.123.123.123', 'status': 'success', }))
使用異常日志記錄
當(dāng)捕獲到異常時,我們應(yīng)使用logger.exception(),這樣就可以在日志中記錄下完整的異常堆棧信息。
import logging logger = logging.getLogger(__name__) try: x = 1 / 0 except ZeroDivisionError: logger.exception("Zero Division Error Caught.")
這樣的日志會包含足夠的信息幫助我們找到和修復(fù)問題。
不要在日志中記錄敏感信息
日志可能被攻擊者用來尋找系統(tǒng)的漏洞,因此我們絕對不能在日志中記錄敏感信息,如密碼、密鑰和用戶的私有數(shù)據(jù)。
五、總結(jié)
在這篇文章中,我們詳細(xì)介紹了Python的logging模塊,包括它的基本介紹,詳解,實(shí)踐中的應(yīng)用,以及一些最佳實(shí)踐??偨Y(jié)上述內(nèi)容:
- logging模塊是Python內(nèi)置的一種靈活且強(qiáng)大的日志記錄工具,它可以將程序運(yùn)行過程中的信息輸出到各種輸出源,如標(biāo)準(zhǔn)輸出、文件、郵件、網(wǎng)絡(luò)等。
- logging模塊提供了多種級別的日志記錄,包括DEBUG,INFO,WARNING,ERROR和CRITICAL。我們可以根據(jù)需求設(shè)置不同的日志級別,以記錄和展示不同嚴(yán)重性的信息。
- 在實(shí)踐中,我們可以使用logging模塊來記錄異常信息,使用RotatingFileHandler進(jìn)行日志滾動,以及在運(yùn)行時改變?nèi)罩炯墑e。
- 對于logging模塊的最佳實(shí)踐,我們提到了在模塊級別使用__name__創(chuàng)建logger,使用合適的日志級別,使用結(jié)構(gòu)化的日志消息,使用異常日志記錄,以及不在日志中記錄敏感信息。
到此這篇關(guān)于Python logging日志模塊的概念與實(shí)踐講解的文章就介紹到這了,更多相關(guān)Python logging日志模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python tkinter圖形界面代碼統(tǒng)計工具(更新)
這篇文章主要為大家詳細(xì)介紹了python tkinter圖形界面代碼統(tǒng)計工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09使用Python開發(fā)一個簡單的本地圖片服務(wù)器
本文介紹了如何結(jié)合wxPython構(gòu)建的圖形用戶界面GUI和Python內(nèi)建的 Web服務(wù)器功能,在本地網(wǎng)絡(luò)中搭建一個私人的,即開即用的網(wǎng)頁相冊,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2025-04-04Python自動化測試基礎(chǔ)必備知識點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于Python自動化測試基礎(chǔ)必備知識點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-02-02python實(shí)現(xiàn)簡單文件讀寫函數(shù)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡單文件讀寫函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-02-02python3.6.3轉(zhuǎn)化為win-exe文件發(fā)布的方法
今天小編就為大家分享一篇python3.6.3轉(zhuǎn)化為win-exe文件發(fā)布的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10關(guān)于tensorflow和keras版本的對應(yīng)關(guān)系
這篇文章主要介紹了關(guān)于tensorflow和keras版本的對應(yīng)關(guān)系,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06