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