python+pytest介面自動化(15)-日誌管理模組loguru簡介

給你一頁白紙發表於2022-05-05

python自帶日誌管理模組logging,使用時可進行模組化配置,詳細可參考博文Python日誌採集(詳細)

logging配置起來比較繁瑣,且在多進行多執行緒等場景下使用時,如果不經過特殊處理,則容易出現日誌丟失或記錄錯亂的情況。

python中有一個用起來非常簡便的第三方日誌管理模組--loguru,不僅可以避免logging的繁瑣配置,而且可以很簡單地避免在logging中多程式多執行緒記錄日誌時出現的問題,甚至還可以自定義控制檯輸出的日誌顏色。

接下來我們來學習怎麼使用loguru模組進行日誌管理。

安裝

第三方模組,需要先安裝,安裝命令如下:

pip install loguru

簡單示例

簡單使用示例如下:

from loguru import logger

# 日誌寫入檔案則需使用add()方法,"../log/test.log"即日誌檔案路徑,可自定義。
# 寫入檔案的日誌裡有中文的話,需要加上encoding="utf-8",否則會顯示亂碼。
logger.add("../log/test.log", encoding="utf-8", rotation="500MB",
           enqueue=True, retention="7 days")

# 列印不同型別的日誌
logger.debug("這是一段debug級別日誌")
logger.info("這是一段info級別日誌")
logger.warning("這是一段warning級別日誌")
logger.critical("這是一段critical級別日誌")

上面的示例程式碼執行之後,會在控制檯列印如下日誌:

同時也會在 "../log/test.log" 路徑中寫入日誌,如下:

由以上結果可以看出:

  • loguru中直接提供了一個日誌記錄物件logger,拿來即用;

  • loguru預設的輸出格式為:時間 | 級別 | 模組名 | 行號 | 日誌資訊;

  • 不同級別的日誌在控制檯顯示顏色不一樣。

當然,在實際專案中我們還需要日誌管理器有更豐富的配置,loguru中的add()方法便具有強大的配置功能,接下來介紹add()方法提供的常用配置功能。

add()常用引數說明

loguru模組原始碼中add()方法的引數如下:

sink(官方文件簡單翻譯如下):

  • 可以傳入類file物件,如sys.stderr或者open('test.log', 'w')

  • 可以傳入檔案路徑strpathlib,如示例程式碼中的寫入日誌檔案路徑。路徑可以使用一些附加引數對其進行引數化,如test_{time}.log{time}即時間引數,建立檔案時檔名稱中會加入時間。

  • 可以傳入像lambda這樣的可呼叫函式的簡單函式,如lambda msg:print(msg)。這允許完全由使用者偏好和需求定義日誌記錄過程。

  • 還可以是使用async def語句定義的非同步協程函式。該函式返回的協程物件將使用loop.create_task()新增到事件迴圈中。在使用complete()結束迴圈之前,應該等待這些任務。

  • 也支援傳入logging模組的Handler,如FileHandlerStreamHandler等,Loguru記錄會自動轉換為日誌模組預期的結構。

level:傳送到sink的日誌訊息的最低日誌級別,即輸出的最低日誌級別。

format:定義日誌的輸出格式。

filter:過濾日誌。

colorize:終端日誌輸出的顏色。

serializer:bool值,輸出日誌時是否先格式化成JSON資料格式。

backtrace:bool值,是否進行異常跟蹤(即backtrace資訊記錄)。

diagnose:bool值,異常跟蹤是否應顯示變數值以簡化除錯。在生產中應將其設定為False,以避免洩漏敏感資料。

enqueue:bool值,日誌訊息輸出之前是否先通過多程式安全佇列,多程式多執行緒執行寫入日誌時需用到,避免日誌記錄丟失或混亂。

catch:bool值,是否自動捕獲接收器處理日誌訊息時發生的錯誤。如果為True,則在sys上顯示異常訊息。

繼續看loguru模組原始碼,如下:

即我們需要將日誌寫入指定的檔案時,可以使用截圖中新增的引數。常用的引數說明如下:

rotation:指定日誌檔案記錄條件,日誌輸出太多需要隔一段時間寫入新檔案時適用。

# rotation指定日誌檔案最大為500MB,超過則新建檔案記錄日誌
logger.add("../log/test.log", rotation="500MB")

# 指定每天12:00新建日誌記錄檔案:rotation="12:00"
# 指定每隔10天新建日誌記錄檔案:rotation="10 days"
# 指定每隔一個星期新建日誌記錄檔案:rotation="1 week"
# 指定每隔兩個月新建日誌記錄檔案:rotation="2 months"

retention:指定日誌保留時長,會清除超過指定時長的資料。

# rotation指定日誌保留時長,如"1 week", "3 days", "2 months"
logger.add("../log/test.log", retention="10 days")

compression:配置檔案壓縮格式。

# rotation指定日誌保留時長,如"gz", "bz2", "xz", "lzma", "tar", "tar.gz", "tar.bz2", "tar.xz", "zip"
logger.add("../log/test.log", compression="zip")

encoding:指定寫入檔案時的編碼格式,這在示例程式碼中已說明。

使用

接下來,我們使用常用的引數來組合定義日誌記錄方式。

from loguru import logger
import sys

# format建議直接使用預設的格式
logger.add("../log/test_{time}.log", level="INFO", encoding="utf-8", enqueue=True, rotation="500MB", retention="1 week")

# 當然也可以自定義format,如下示例
# logger.add("../log/test_{time}.log", 
			format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {name} | {line} | {message}", encoding="utf-8", 				enqueue=True, rotation="500MB", retention="1 week")

# 列印不同型別的日誌
logger.debug("這是一段debug級別日誌")
logger.info("這是一段info級別日誌")
logger.warning("這是一段warning級別日誌")
logger.critical("這是一段critical級別日誌")

引數說明:

  • sink="../log/test_{time}.log",即指定日誌檔案路徑,且加入了{time},建立.log檔案時名稱會加上時間。

  • level="INFO",寫入檔案時只會寫入INFO及以上級別的日誌 (需要大寫),即INFO、WARNING、CRITICAL。

  • encoding="utf-8",日誌寫入檔案時指定編碼格式為"utf-8",否則有中文的話會顯示亂碼。

  • enqueue=True,支援多執行緒多程式執行時按照佇列寫入。

  • rotation="500MB",日誌檔案最大為500MB,超過則新建。

  • retention="1 week",日誌保留一週,過後則清除。

  • format沒有指定即使用預設格式,建議直接使用預設的格式,見程式碼註釋。

執行程式碼後,結果如下:

從結果中可以看出來,輸出內容中模組部分顯示的是如__main__:<module>:20的形式,而並不是我們想要看到的對應的模組名稱,這是因為直接執執行了當前檔案的檔案,如果是其他模組呼叫執行便會顯示對應的模組名稱。

相關文章