您好,登錄后才能下訂單哦!
本篇內容介紹了“python中logging模塊簡單和高級使用的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在 Python 中,可以使用內置的 logging 模塊來記錄應用程序的信息。最簡單的用法是使用 basicConfig() 函數配置 logging 模塊,然后使用 getLogger() 方法創建一個 Logger 對象,用于記錄信息。下面是一個簡單的例子:
import logging # 配置 logging logging.basicConfig(level=logging.DEBUG) # 創建 logger 對象 logger = logging.getLogger() # 記錄信息 logger.debug('這是一條調試信息') logger.info('這是一條普通信息') logger.warning('這是一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴重錯誤信息')
在上面的例子中,我們使用 basicConfig() 函數設置日志級別為 DEBUG(最詳細的日志信息),然后使用 getLogger() 方法創建了一個 Logger 對象。接下來,我們使用 Logger 對象的不同方法記錄不同級別的信息。日志級別的優先級從低到高依次是 DEBUG、INFO、WARNING、ERROR、CRITICAL。
logging 模塊支持自定義日志格式,可以使用 format 參數來指定日志格式。日志格式可以包括時間、日志級別、日志信息等。下面是一個自定義日志格式的例子:
import logging # 配置 logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s') # 創建 logger 對象 logger = logging.getLogger() # 記錄信息 logger.debug('這是一條調試信息') logger.info('這是一條普通信息') logger.warning('這是一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴重錯誤信息')
在上面的例子中,我們使用 format 參數指定了日志格式,其中 %(asctime)s 表示時間,%(levelname)s 表示日志級別,%(message)s 表示日志信息。
logging 模塊支持將日志輸出到文件中,可以使用 filename 和 filemode 參數來指定輸出文件名和打開模式。下面是一個將日志輸出到文件中的例子:
import logging # 配置 logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s', filename='app.log', filemode='w') # 創建 logger 對象 logger = logging.getLogger() # 記錄信息 logger.debug('這是一條調試信息') logger.info('這是一條普通信息') logger.warning('這是一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴重錯誤信息')
在上面的例子中,我們使用 filename 參數指定輸出文件名為 app.log,使用 filemode 參數指定打開模式為 w(覆蓋寫入)。
logging 模塊提供了處理程序(Handler)的概念,用于處理日志記錄的輸出。默認情況下,日志記錄會輸出到控制臺。我們可以添加一個或多個處理程序來指定不同的日志輸出方式。例如,可以將日志輸出到文件、網絡、數據庫等。下面是一個將日志輸出到文件和控制臺的例子:
import logging # 創建 logger 對象 logger = logging.getLogger() # 創建控制臺處理程序并設置日志級別 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 創建文件處理程序并設置日志級別 file_handler = logging.FileHandler('app.log') file_handler.setLevel(logging.DEBUG) # 創建日志格式器 formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') # 設置處理程序的日志格式器 console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # 添加處理程序到 logger 對象 logger.addHandler(console_handler) logger.addHandler(file_handler) # 記錄信息 logger.debug('這是一條調試信息') logger.info('這是一條普通信息') logger.warning('這是一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴重錯誤信息')
在上面的例子中,我們創建了一個 Logger 對象,并添加了兩個處理程序:一個控制臺處理程序和一個文件處理程序。我們還創建了一個日志格式器,并將其設置為處理程序的格式器。然后,我們將處理程序添加到 Logger 對象中,最后記錄了一些信息。由于控制臺處理程序的日志級別設置為 INFO,因此調試信息不會輸出到控制臺。
logging 模塊還提供了過濾器(Filter)的概念,用于對日志記錄進行過濾。可以使用過濾器來控制哪些日志記錄應該被處理,哪些不應該被處理。下面是一個使用過濾器的例子:
import logging # 創建 logger 對象 logger = logging.getLogger() # 創建控制臺處理程序并設置日志級別 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 創建過濾器并設置過濾條件 class CustomFilter(logging.Filter): def filter(self, record): return record.msg.startswith('警告') filter = CustomFilter() # 設置處理程序的過濾器 console_handler.addFilter(filter) # 創建日志格式器 formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') # 設置處理程序的日志格式器 console_handler.setFormatter(formatter) # 添加處理程序到 logger 對象 logger.addHandler(console_handler) # 記錄信息 logger.debug('這是一條調試信息') logger.info('這是一條普通信息') logger.warning('警告:這是一條警告信息') logger.warning('這是又一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴重錯誤信息')
在上面的例子中,我們創建了一個 Logger 對象,并添加了一個控制臺處理程序。我們還創建了一個過濾器,并將其設置為控制臺處理程序的過濾器。過濾器的 filter()方法用于指定哪些記錄應該被處理,它返回 True 或 False,表示是否處理該記錄。在這個例子中,我們創建了一個自定義過濾器 CustomFilter,用于只處理以“警告”開頭的日志記錄。
除了上述介紹的基本用法外,logging 模塊還提供了一些高級功能,如日志回溯、日志輪換、日志緩沖等。
logging 模塊支持記錄回溯信息,可以使用 exc_info 參數來記錄當前異常的回溯信息。
在 Python 中,當程序發生異常時,解釋器會自動輸出異常信息和回溯信息。異常信息通常包含異常類型和異常消息,回溯信息包含了程序執行時的堆棧信息,即函數調用棧的跟蹤信息。回溯信息可以幫助開發人員定位程序錯誤的根源。
日志回溯是使用 logging 模塊記錄程序發生的異常信息和回溯信息。可以使用 Logger 對象的 error()、exception() 或 critical() 方法來記錄異常信息和回溯信息。這些方法會自動記錄當前異常的類型、消息和回溯信息,無需額外的代碼
下面是一個記錄回溯信息的例子:
import logging # 配置 logging logging.basicConfig(level=logging.DEBUG) # 創建 logger 對象 logger = logging.getLogger() # 記錄信息和回溯信息 try: 1/0 except Exception as e: logger.error('發生異常', exc_info=True)
在上面的例子中,我們使用 exc_info=True 參數記錄了當前異常的回溯信息。當發生異常時,日志記錄將包括異常信息和回溯信息。
2023-04-19 15:47:36,688 ERROR 發生異常 Traceback (most recent call last): File "<ipython-input-1-728869f0c30f>", line 7, in <module> 1/0 ZeroDivisionError: division by zero
logging 模塊支持日志輪換功能,可以將日志按時間或大小輪換到不同的文件中。
日志輪換(Log Rotation)是指在日志文件大小達到一定值或一定時間間隔后,自動將當前日志文件備份并創建一個新的日志文件,以便管理和維護。日志輪換可以避免日志文件過大、影響系統性能和管理不便等問題。
在 Python 的 logging 模塊中,可以使用 logging.handlers 模塊中的 RotatingFileHandler 和 TimedRotatingFileHandler 類來實現日志輪換功能。其中,RotatingFileHandler 類是按文件大小輪換日志文件,TimedRotatingFileHandler 類是按時間輪換日志文件。
下面是一個按時間輪換日志的例子:
import logging from logging.handlers import TimedRotatingFileHandler # 創建 logger 對象 logger = logging.getLogger() # 創建按時間輪換的文件處理程序 handler = TimedRotatingFileHandler('app.log', when='midnight', backupCount=7) # 創建日志格式器 formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') # 設置處理程序的日志格式器 handler.setFormatter(formatter) # 添加處理程序到 logger 對象 logger.addHandler(handler) # 記錄信息 logger.debug('這是一條調試信息') logger.info('這是一條普通信息') logger.warning('這是一條警告信息') logger.error('這是一條錯誤信息') logger.critical('這是一條嚴重錯誤信息')
在上面的例子中,我們創建了一個按時間輪換的文件處理程序,它會在每天的午夜時分割日志文件。when 參數可以指定分割的時間點,backupCount 參數可以指定保留的日志文件個數。在使用 TimedRotatingFileHandler 類型的日志處理器對象時,會根據指定的時間間隔創建新的日志文件,并在文件名中添加時間戳后綴。
具體來說,當日志文件發生輪換時,會在原來的日志文件名后面添加一個時間戳后綴,例如:
原始日志文件名為 app.log,當輪換發生時,會將其備份為 app.log.2023-04-20,其中 2023-04-20 為輪換時的日期。
下次輪換發生時,會將原始日志文件名為 app.log 的文件備份為 app.log.2023-04-21,同時將 app.log.2023-04-20 刪除,以保持日志文件的數量在備份數量之內。
因此,使用 TimedRotatingFileHandler 類型的日志處理器對象時,每個日志文件名中都會包含時間戳后綴,以便區分不同的日志文件。
在使用 logging 模塊記錄日志時,默認情況下,每條日志信息都會立即寫入到磁盤文件中。這樣會頻繁地訪問磁盤,導致程序性能下降。
為了避免頻繁訪問磁盤,logging 模塊提供了緩沖機制。當使用緩沖機制時,多條日志信息會先存儲在內存中,直到滿足一定條件后再將它們寫入磁盤文件。通過這種方式可以減少頻繁訪問磁盤的次數,提高程序的性能和效率。
在 logging 模塊中,可以使用 logging.handlers
模塊中的 BufferingHandler
類來實現日志緩沖機制。BufferingHandler
類中的 bufferSize
參數指定了緩沖區的大小。當日志信息達到緩沖區的容量時,就會將緩沖區中的信息寫入磁盤文件。
下面是一個使用日志緩沖機制的例子:
import logging from logging.handlers import BufferingHandler # 配置 logging logging.basicConfig(level=logging.DEBUG) # 創建 logger 對象 logger = logging.getLogger() # 創建帶緩沖的文件處理程序 handler = BufferingHandler(capacity=5) # 將處理程序添加到 logger 對象 logger.addHandler(handler) # 記錄信息 for i in range(10): logger.debug('這是第 %s 條調試信息', i+1)
在上面的例子中,我們使用 BufferingHandler
類型的日志處理器對象創建了一個帶緩沖的文件處理程序,并設置緩沖區的容量為 5
。然后使用 logger 對象記錄了 10
條日志信息。
由于緩沖區容量為 5
,當記錄了 5
條日志信息后,就會將它們一起寫入磁盤文件。因此,第 1
條到第 5
條日志信息會被存儲在內存緩沖區中,而第 6
條到第 10
條日志信息會被存儲在內存緩沖區中,并在最后一次寫入時一起寫入到磁盤文件中。
通過這種方式,我們可以減少頻繁訪問磁盤的次數,提高程序的性能和效率。需要注意的是,設置過大的緩沖區容量可能會占用過多的內存,從而導致程序崩潰。因此,需要根據實際需求和系統資源進行權衡和設置。
“python中logging模塊簡單和高級使用的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。