『無為則無心』Python日誌 — 65、日誌模組logging的使用

繁華似錦Fighting發表於2022-03-04

1、logger類用法

logger類:logger用於提供日誌介面,常用於配置和傳送日誌訊息。

我們一般使用logging.getLogger(name)方法來獲得一個logger物件。

其中,可選引數name指定日誌器名稱,預設為“root”。

常用方法包括:

  • logger.setLevel():設定日誌器處理日誌資訊的最低階別。
  • logger.addHandler():為該logger物件新增一個handler物件。
  • logger.removeHandler():為該logger物件新增移除一個handler物件。
  • logger.addFilter():為該logger物件新增一個filter物件。
  • logger.removeFilter():為該logger物件移除一個filter物件。
  • 建立一個對應等級的日誌記錄:
    logger.debug()
    logger.info()
    logger.warning()
    logger.error()
    logger.critical()
  • logger.log():獲取一個日誌level引數,來建立一個日誌記錄。

示例:

"""
logging模組是Python的內建模組,不需要安裝。
"""
# 匯入logging模組
import logging

# 建立一個日誌器,就是一個logger物件
logger = logging.getLogger('logger')

# 輸出日誌資訊
logger.debug('輸出debug級別的日誌')
logger.info('輸出info級別的日誌')
logger.warning('輸出warning級別的日誌')
logger.error('輸出error級別的日誌')
logger.critical('輸出critical級別的日誌')

"""
# 右鍵執行程式碼
# 結果如下:
輸出warning級別的日誌
輸出error級別的日誌
輸出critical級別的日誌
"""

總結:

預設情況下Python的logging模組將日誌列印到了標準輸出中(控制檯),且只顯示了大於等於WARNING級別的日誌,這說明預設的日誌級別設定為WARNING。

2、handler類用法

handler類:handler物件用於將指定的日誌資訊傳送到指定的位置。

一個logger物件可以新增多個handler,每個handler又可以定義不同日誌級別,以實現日誌分級過濾顯示。

也就是說通過handler我們可以將日誌同時輸出到多個位置。

常用的方法包括:

  • handler.setLevel():設定handler處理的日誌資訊最低階別。
  • handler.setFormatter():為handler設定一個格式器物件。
  • handler.addFilter():為handler新增一個過濾器物件。
  • handler.removeFilter():為handler刪除一個過濾器物件。
  • logging.StreamHandler():將日誌資訊傳送到Stream
  • logging.FileHandler():將日誌訊息傳送到磁碟檔案。

示例:把上面的示例,實現DEBUG級別日誌的輸出。

"""
logging模組是Python的內建模組,不需要安裝。
"""
# 匯入logging模組
import logging

# 建立一個日誌器,就是一個logger物件
logger = logging.getLogger('logger')

# 1.設定logger日誌級別
logger.setLevel(logging.DEBUG)

# 2.建立一個輸出的處理器,讓它輸入到控制檯
sh = logging.StreamHandler()

# 3.把輸出處理器新增到日誌器中
logger.addHandler(sh)

# 輸出日誌資訊
logger.debug('輸出debug級別的日誌')
logger.info('輸出info級別的日誌')
logger.warning('輸出warning級別的日誌')
logger.error('輸出error級別的日誌')
logger.critical('輸出critical級別的日誌')

"""
# 右鍵執行程式碼
# 結果如下:
輸出debug級別的日誌
輸出info級別的日誌
輸出warning級別的日誌
輸出error級別的日誌
輸出critical級別的日誌
"""

說明:

當我們設定好logger日誌級別後,執行程式碼,發現還是和上面一樣,只輸出了warning級別日誌。

這個時候我們是改變了logger預設設定,就需要建立一個日誌處理器Handler,來處理輸出這個自定義logger物件的日誌輸出。

3、formatter類用法

formatter類:formatter物件用來輸出格式化字串,也叫做格式器。

構造方法如下:

logging.Formatter.__init__(fmt=None, datefmt=None)

其中:

fmt:指定資訊(日誌)的格式化字串,如不設定則使用資訊的原始字串。

datefmt:指定日期的格式化字串,如不設定則使用預設格式"%Y-%m-%d %H:%M:%S"

logging模組中定義好的可以用於format格式字串說明:

欄位/屬性名稱 使用格式 描述
asctime %(asctime)s 將日誌的時間構造成可讀的形式,預設情況下是‘2016-02-08 12:00:00,123’精確到毫秒。
name %(name)s 所使用的日誌器名稱,預設是root,因為預設使用的是 rootLogger
filename %(filename)s 呼叫日誌輸出函式的模組的檔名; pathname的檔名部分,包含檔案字尾。
funcName %(funcName)s 由哪個function發出的log, 呼叫日誌輸出函式的函式名。
levelname %(levelname)s 日誌的最終等級(被filter修改後的)。
message %(message)s 日誌資訊, 日誌記錄的文字內容。
lineno %(lineno)d 當前日誌的行號, 呼叫日誌輸出函式的語句所在的程式碼行。
levelno %(levelno)s 該日誌記錄的數字形式的日誌級別(10, 20, 30, 40, 50)。
pathname %(pathname)s 完整路徑 ,呼叫日誌輸出函式的模組的完整路徑名,可能沒有。
process %(process)s 當前程式, 程式ID。可能沒有。
processName %(processName)s 程式名稱,Python 3.1新增。
thread %(thread)s 當前執行緒, 執行緒ID。可能沒有。
threadName %(thread)s 執行緒名稱。
module %(module)s 呼叫日誌輸出函式的模組名,filename的名稱部分,不包含字尾即不包含檔案字尾的檔名。
created %(created)f 當前時間,用UNIX標準的表示時間的浮點數表示; 日誌事件發生的時間--時間戳,就是當時呼叫time.time()函式返回的值。
relativeCreated %(relativeCreated)d 輸出日誌資訊時的,自Logger建立以 來的毫秒數; 日誌事件發生的時間相對於logging模組載入時間的相對毫秒數。
msecs %(msecs)d 日誌事件發生事件的毫秒部分。logging.basicConfig()中用了引數datefmt,將會去掉asctime中產生的毫秒部分,可以用這個加上。

示例:

"""
logging模組是Python的內建模組,不需要安裝。

步驟:
1,定義格式器
2,把格式器輸入處理器中
"""
# 匯入logging模組
import logging

# 建立一個日誌器,就是一個logger物件
logger = logging.getLogger('logger')

# 設定logger輸入級別
logger.setLevel(logging.DEBUG)

# 1.建立日誌格式器
formator = logging.Formatter(fmt="%(asctime)s [ %(filename)s ]  %(lineno)d行 | [ %(levelname)s ] | [%(message)s]",
                             datefmt="%Y/%m/%d/%X")

# 建立一個輸出的處理器,讓它輸入到控制檯
sh = logging.StreamHandler()

# 把輸出處理器新增到日誌器中
logger.addHandler(sh)

# 2.給處理器新增格式器
sh.setFormatter(formator)

# 輸出日誌資訊
logger.debug('輸出debug級別的日誌')
logger.info('輸出info級別的日誌')
logger.warning('輸出warning級別的日誌')
logger.error('輸出error級別的日誌')
logger.critical('輸出critical級別的日誌')

"""
# 右鍵執行程式碼
# 結果如下:
2021/01/15/03:15:44 [ demo_log2.py ]  27行 | [ DEBUG ] | [輸出debug級別的日誌]
2021/01/15/03:15:44 [ demo_log2.py ]  28行 | [ INFO ] | [輸出info級別的日誌]
2021/01/15/03:15:44 [ demo_log2.py ]  29行 | [ WARNING ] | [輸出warning級別的日誌]
2021/01/15/03:15:44 [ demo_log2.py ]  30行 | [ ERROR ] | [輸出error級別的日誌]
2021/01/15/03:15:44 [ demo_log2.py ]  31行 | [ CRITICAL ] | [輸出critical級別的日誌]
"""

4、filter類用法

filter類filter是一個過濾器,可以實現比loggerhandle更細緻靈活的過濾功能。

設定只輸出符合過濾條件的日誌記錄,提供給Logger類和Handler類使用。

Logger類預設過濾具有相同字首的所有日誌記錄。

Logger只有在處理日誌記錄時即時檢查Filter,所以繼承Logger不會檢查Filter

Handler首先註冊Filter,然後在處理後續日誌記錄時檢查。

首先定義logging.Filter的擴充套件類,並在其中實現def filter(self, record)方法。然後建立定製Filter類的例項,並通過addFilter()方法附加到LoggerHandler

參考:https://www.sohu.com/a/280170254_697896

相關文章