python中的logging模塊的簡單應(yīng)用和高級使用
簡單使用
在 Python 中,可以使用內(nèi)置的 logging 模塊來記錄應(yīng)用程序的信息。最簡單的用法是使用 basicConfig() 函數(shù)配置 logging 模塊,然后使用 getLogger() 方法創(chuàng)建一個 Logger 對象,用于記錄信息。下面是一個簡單的例子:
import logging # 配置 logging logging.basicConfig(level=logging.DEBUG) # 創(chuàng)建 logger 對象 logger = logging.getLogger() # 記錄信息 logger.debug('這是一條調(diào)試信息') logger.info('這是一條普通信息') logger.warning('這是一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴(yán)重錯誤信息')
在上面的例子中,我們使用 basicConfig() 函數(shù)設(shè)置日志級別為 DEBUG(最詳細(xì)的日志信息),然后使用 getLogger() 方法創(chuàng)建了一個 Logger 對象。接下來,我們使用 Logger 對象的不同方法記錄不同級別的信息。日志級別的優(yōu)先級從低到高依次是 DEBUG、INFO、WARNING、ERROR、CRITICAL。
日志格式
logging 模塊支持自定義日志格式,可以使用 format 參數(shù)來指定日志格式。日志格式可以包括時間、日志級別、日志信息等。下面是一個自定義日志格式的例子:
import logging # 配置 logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s') # 創(chuàng)建 logger 對象 logger = logging.getLogger() # 記錄信息 logger.debug('這是一條調(diào)試信息') logger.info('這是一條普通信息') logger.warning('這是一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴(yán)重錯誤信息')
在上面的例子中,我們使用 format 參數(shù)指定了日志格式,其中 %(asctime)s 表示時間,%(levelname)s 表示日志級別,%(message)s 表示日志信息。
輸出到文件
logging 模塊支持將日志輸出到文件中,可以使用 filename 和 filemode 參數(shù)來指定輸出文件名和打開模式。下面是一個將日志輸出到文件中的例子:
import logging # 配置 logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', filename='app.log', filemode='w') # 創(chuàng)建 logger 對象 logger = logging.getLogger() # 記錄信息 logger.debug('這是一條調(diào)試信息') logger.info('這是一條普通信息') logger.warning('這是一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴(yán)重錯誤信息')
在上面的例子中,我們使用 filename 參數(shù)指定輸出文件名為 app.log,使用 filemode 參數(shù)指定打開模式為 w(覆蓋寫入)。
處理程序(Handler)
logging 模塊提供了處理程序(Handler)的概念,用于處理日志記錄的輸出。默認(rèn)情況下,日志記錄會輸出到控制臺。我們可以添加一個或多個處理程序來指定不同的日志輸出方式。例如,可以將日志輸出到文件、網(wǎng)絡(luò)、數(shù)據(jù)庫等。下面是一個將日志輸出到文件和控制臺的例子:
import logging # 創(chuàng)建 logger 對象 logger = logging.getLogger() # 創(chuàng)建控制臺處理程序并設(shè)置日志級別 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 創(chuàng)建文件處理程序并設(shè)置日志級別 file_handler = logging.FileHandler('app.log') file_handler.setLevel(logging.DEBUG) # 創(chuàng)建日志格式器 formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') # 設(shè)置處理程序的日志格式器 console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # 添加處理程序到 logger 對象 logger.addHandler(console_handler) logger.addHandler(file_handler) # 記錄信息 logger.debug('這是一條調(diào)試信息') logger.info('這是一條普通信息') logger.warning('這是一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴(yán)重錯誤信息')
在上面的例子中,我們創(chuàng)建了一個 Logger 對象,并添加了兩個處理程序:一個控制臺處理程序和一個文件處理程序。我們還創(chuàng)建了一個日志格式器,并將其設(shè)置為處理程序的格式器。然后,我們將處理程序添加到 Logger 對象中,最后記錄了一些信息。由于控制臺處理程序的日志級別設(shè)置為 INFO,因此調(diào)試信息不會輸出到控制臺。
過濾器(Filter)
logging 模塊還提供了過濾器(Filter)的概念,用于對日志記錄進(jìn)行過濾??梢允褂眠^濾器來控制哪些日志記錄應(yīng)該被處理,哪些不應(yīng)該被處理。下面是一個使用過濾器的例子:
import logging # 創(chuàng)建 logger 對象 logger = logging.getLogger() # 創(chuàng)建控制臺處理程序并設(shè)置日志級別 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 創(chuàng)建過濾器并設(shè)置過濾條件 class CustomFilter(logging.Filter): def filter(self, record): return record.msg.startswith('警告') filter = CustomFilter() # 設(shè)置處理程序的過濾器 console_handler.addFilter(filter) # 創(chuàng)建日志格式器 formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') # 設(shè)置處理程序的日志格式器 console_handler.setFormatter(formatter) # 添加處理程序到 logger 對象 logger.addHandler(console_handler) # 記錄信息 logger.debug('這是一條調(diào)試信息') logger.info('這是一條普通信息') logger.warning('警告:這是一條警告信息') logger.warning('這是又一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴(yán)重錯誤信息')
在上面的例子中,我們創(chuàng)建了一個 Logger 對象,并添加了一個控制臺處理程序。我們還創(chuàng)建了一個過濾器,并將其設(shè)置為控制臺處理程序的過濾器。過濾器的 filter()方法用于指定哪些記錄應(yīng)該被處理,它返回 True 或 False,表示是否處理該記錄。在這個例子中,我們創(chuàng)建了一個自定義過濾器 CustomFilter,用于只處理以“警告”開頭的日志記錄。
高級使用
除了上述介紹的基本用法外,logging 模塊還提供了一些高級功能,如日志回溯、日志輪換、日志緩沖等。
日志回溯
logging 模塊支持記錄回溯信息,可以使用 exc_info 參數(shù)來記錄當(dāng)前異常的回溯信息。
在 Python 中,當(dāng)程序發(fā)生異常時,解釋器會自動輸出異常信息和回溯信息。異常信息通常包含異常類型和異常消息,回溯信息包含了程序執(zhí)行時的堆棧信息,即函數(shù)調(diào)用棧的跟蹤信息?;厮菪畔⒖梢詭椭_發(fā)人員定位程序錯誤的根源。
日志回溯是使用 logging 模塊記錄程序發(fā)生的異常信息和回溯信息??梢允褂?Logger 對象的 error()、exception() 或 critical() 方法來記錄異常信息和回溯信息。這些方法會自動記錄當(dāng)前異常的類型、消息和回溯信息,無需額外的代碼
下面是一個記錄回溯信息的例子:
import logging # 配置 logging logging.basicConfig(level=logging.DEBUG) # 創(chuàng)建 logger 對象 logger = logging.getLogger() # 記錄信息和回溯信息 try: 1/0 except Exception as e: logger.error('發(fā)生異常', exc_info=True)
在上面的例子中,我們使用 exc_info=True 參數(shù)記錄了當(dāng)前異常的回溯信息。當(dāng)發(fā)生異常時,日志記錄將包括異常信息和回溯信息。
2023-04-19 15:47:36,688 ERROR 發(fā)生異常 Traceback (most recent call last): File "<ipython-input-1-728869f0c30f>", line 7, in <module> 1/0 ZeroDivisionError: division by zero
日志輪換
logging 模塊支持日志輪換功能,可以將日志按時間或大小輪換到不同的文件中。
日志輪換(Log Rotation)是指在日志文件大小達(dá)到一定值或一定時間間隔后,自動將當(dāng)前日志文件備份并創(chuàng)建一個新的日志文件,以便管理和維護(hù)。日志輪換可以避免日志文件過大、影響系統(tǒng)性能和管理不便等問題。
在 Python 的 logging 模塊中,可以使用 logging.handlers 模塊中的 RotatingFileHandler 和 TimedRotatingFileHandler 類來實(shí)現(xiàn)日志輪換功能。其中,RotatingFileHandler 類是按文件大小輪換日志文件,TimedRotatingFileHandler 類是按時間輪換日志文件。
下面是一個按時間輪換日志的例子:
import logging from logging.handlers import TimedRotatingFileHandler # 創(chuàng)建 logger 對象 logger = logging.getLogger() # 創(chuàng)建按時間輪換的文件處理程序 handler = TimedRotatingFileHandler('app.log', when='midnight', backupCount=7) # 創(chuàng)建日志格式器 formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') # 設(shè)置處理程序的日志格式器 handler.setFormatter(formatter) # 添加處理程序到 logger 對象 logger.addHandler(handler) # 記錄信息 logger.debug('這是一條調(diào)試信息') logger.info('這是一條普通信息') logger.warning('這是一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴(yán)重錯誤信息')
在上面的例子中,我們創(chuàng)建了一個按時間輪換的文件處理程序,它會在每天的午夜時分割日志文件。when 參數(shù)可以指定分割的時間點(diǎn),backupCount 參數(shù)可以指定保留的日志文件個數(shù)。在使用 TimedRotatingFileHandler 類型的日志處理器對象時,會根據(jù)指定的時間間隔創(chuàng)建新的日志文件,并在文件名中添加時間戳后綴。
具體來說,當(dāng)日志文件發(fā)生輪換時,會在原來的日志文件名后面添加一個時間戳后綴,例如:
- 原始日志文件名為 app.log,當(dāng)輪換發(fā)生時,會將其備份為 app.log.2023-04-20,其中 2023-04-20 為輪換時的日期。
- 下次輪換發(fā)生時,會將原始日志文件名為 app.log 的文件備份為 app.log.2023-04-21,同時將 app.log.2023-04-20 刪除,以保持日志文件的數(shù)量在備份數(shù)量之內(nèi)。
因此,使用 TimedRotatingFileHandler 類型的日志處理器對象時,每個日志文件名中都會包含時間戳后綴,以便區(qū)分不同的日志文件。
日志緩沖
在使用 logging 模塊記錄日志時,默認(rèn)情況下,每條日志信息都會立即寫入到磁盤文件中。這樣會頻繁地訪問磁盤,導(dǎo)致程序性能下降。
為了避免頻繁訪問磁盤,logging 模塊提供了緩沖機(jī)制。當(dāng)使用緩沖機(jī)制時,多條日志信息會先存儲在內(nèi)存中,直到滿足一定條件后再將它們寫入磁盤文件。通過這種方式可以減少頻繁訪問磁盤的次數(shù),提高程序的性能和效率。
在 logging 模塊中,可以使用 logging.handlers
模塊中的 BufferingHandler
類來實(shí)現(xiàn)日志緩沖機(jī)制。BufferingHandler
類中的 bufferSize
參數(shù)指定了緩沖區(qū)的大小。當(dāng)日志信息達(dá)到緩沖區(qū)的容量時,就會將緩沖區(qū)中的信息寫入磁盤文件。
下面是一個使用日志緩沖機(jī)制的例子:
import logging from logging.handlers import BufferingHandler # 配置 logging logging.basicConfig(level=logging.DEBUG) # 創(chuàng)建 logger 對象 logger = logging.getLogger() # 創(chuàng)建帶緩沖的文件處理程序 handler = BufferingHandler(capacity=5) # 將處理程序添加到 logger 對象 logger.addHandler(handler) # 記錄信息 for i in range(10): logger.debug('這是第 %s 條調(diào)試信息', i+1)
在上面的例子中,我們使用 BufferingHandler
類型的日志處理器對象創(chuàng)建了一個帶緩沖的文件處理程序,并設(shè)置緩沖區(qū)的容量為 5
。然后使用 logger 對象記錄了 10
條日志信息。
由于緩沖區(qū)容量為 5
,當(dāng)記錄了 5
條日志信息后,就會將它們一起寫入磁盤文件。因此,第 1
條到第 5
條日志信息會被存儲在內(nèi)存緩沖區(qū)中,而第 6
條到第 10
條日志信息會被存儲在內(nèi)存緩沖區(qū)中,并在最后一次寫入時一起寫入到磁盤文件中。
通過這種方式,我們可以減少頻繁訪問磁盤的次數(shù),提高程序的性能和效率。需要注意的是,設(shè)置過大的緩沖區(qū)容量可能會占用過多的內(nèi)存,從而導(dǎo)致程序崩潰。因此,需要根據(jù)實(shí)際需求和系統(tǒng)資源進(jìn)行權(quán)衡和設(shè)置。
總結(jié)
logging 模塊是 Python 標(biāo)準(zhǔn)庫中一個功能強(qiáng)大的日志記錄工具。它可以記錄應(yīng)用程序的各種信息,并支持自定義日志格式、日志輸出方式、日志級別、日志過濾器、日志回溯、日志輪換、日志緩沖等功能。使用 logging 模塊可以幫助開發(fā)人員更好地調(diào)試和分析應(yīng)用程序,提高開發(fā)效率和程序質(zhì)量。
到此這篇關(guān)于python中的logging模塊的簡單應(yīng)用和高級使用的文章就介紹到這了,更多相關(guān)python的logging模塊高級應(yīng)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
安裝python3.7編譯器后如何正確安裝opnecv的方法詳解
這篇文章主要介紹了安裝python3.7編譯器后如何正確安裝opnecv,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06Python從列表推導(dǎo)到zip()函數(shù)的5種技巧總結(jié)
在本篇文章里小編給大家整理的是關(guān)于Python從列表推導(dǎo)到zip()函數(shù)的5種技巧的相關(guān)知識點(diǎn)和代碼,需要的朋友們參考學(xué)習(xí)下。2019-10-10Python線程之同步機(jī)制實(shí)際應(yīng)用場景舉例說明
這篇文章主要給大家分享的是Python線程之同步機(jī)制實(shí)際應(yīng)用場景舉例說明,銀行轉(zhuǎn)賬小栗子供大家參考學(xué)習(xí),希望對你有一定的幫助2022-02-02Keras使用預(yù)訓(xùn)練模型遷移學(xué)習(xí)單通道灰度圖像詳解
這篇文章主要介紹了Keras使用預(yù)訓(xùn)練模型遷移學(xué)習(xí)單通道灰度圖像詳解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02pytorch 圖像預(yù)處理之減去均值,除以方差的實(shí)例
今天小編就為大家分享一篇pytorch 圖像預(yù)處理之減去均值,除以方差的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01