欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中的logging模塊的簡單應(yīng)用和高級(jí)使用

 更新時(shí)間:2023年04月21日 09:59:17   作者:菜鳥小超  
在?Python?中,可以使用內(nèi)置的?logging?模塊來記錄應(yīng)用程序的信息,logging?模塊還提供了一些高級(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)文章

最新評(píng)論