Python日誌管理模組loguru
Python中的日誌管理模組可以使用自帶的logging,也可使用第三方Loguru模組,使用logging需要配置Handler、Formatter 進行一些處理,配置比較繁瑣,而使用Loguru則較為簡單。
安裝
pip install loguru
基本使用
from loguru import logger
logger.info("this is a test info")
logger.debug("this is a debug message ")
logger.error("this is a error message ")
從loguru賬號引入logger後,直接呼叫其 info,debug,error 方法即可。在 loguru 裡面有且僅有一個主要物件,那就是 logger,loguru 裡面有且僅有一個 logger,而且它已經被提前配置了一些基礎資訊,比如比較友好的格式化、文字顏色資訊等等。 上面的程式碼執行結果如下:
2021-04-27 17:30:13.308 | INFO | __main__:<module>:10 - this is a test info
2021-04-27 17:30:13.309 | DEBUG | __main__:<module>:11 - this is a debug message
2021-04-27 17:30:13.309 | ERROR | __main__:<module>:12 - this is a error message
可以看到其預設的輸出格式是上面的內容,有時間、級別、模組名、行號以及日誌資訊,不需要手動建立 logger,直接使用即可。上面的日誌資訊是直接輸出在控制檯的,如果想要輸出到其他的位置,比如存為檔案,我們只需要使用一行程式碼宣告即可。 例如將結果同時輸出到一個 runtime.log 檔案裡面,可以這麼寫:
from loguru import logger
logger.add("runtime.log")
logger.info("this is a test info")
logger.debug("this is a debug message ")
logger.error("this is a error message ")
詳細使用
loguru 對輸出到檔案的配置有非常強大的支援,比如支援輸出到多個檔案,分級別分別輸出,過大建立新檔案,過久自動刪除等等。add 方法定義:
def add( self, sink, *, level=_defaults.LOGURU_LEVEL, format=_defaults.LOGURU_FORMAT, filter=_defaults.LOGURU_FILTER, colorize=_defaults.LOGURU_COLORIZE, serialize=_defaults.LOGURU_SERIALIZE, backtrace=_defaults.LOGURU_BACKTRACE, diagnose=_defaults.LOGURU_DIAGNOSE, enqueue=_defaults.LOGURU_ENQUEUE, catch=_defaults.LOGURU_CATCH, **kwargs ): pass
skin引數可以傳入多種不同的資料結構,如下:
- sink 可以傳入一個 file 物件,例如 sys.stderr 或者 open('file.log', 'w') 都可以。
- sink 可以直接傳入一個 str 字串或者 pathlib.Path 物件,其實就是代表檔案路徑的,如果識別到是這種型別,它會自動建立對應路徑的日誌檔案並將日誌輸出進去。
- sink 可以是一個方法,可以自行定義輸出實現。
- sink 可以是一個 logging 模組的 Handler,比如 FileHandler、StreamHandler 等等,或者上文中我們提到的 CMRESHandler 照樣也是可以的,這樣就可以實現自定義 Handler 的配置。
- sink 還可以是一個自定義的類,具體的實現規範可以參見官方文件。
基本引數
其他引數例如 format、filter、level 等等。 其實它們的概念和格式和 logging 模組都是基本一樣的了,例如這裡使用 format、filter、level 來規定輸出的格式:
logger.add('runtime.log', format="{time} {level} {message}", filter="my_module", level="INFO")
刪除skin
新增 sink 之後可以對其進行刪除,相當於重新重新整理並寫入新的內容。 刪除的時候根據剛剛 add 方法返回的 id 進行刪除即可,看下面的例子:
from loguru import logger
trace = logger.add('runtime.log')
logger.debug('this is a debug message')
logger.remove(trace)
logger.debug('this is another debug message')
控制檯輸出:
2021-04-27 17:56:29.254 | DEBUG | __main__:<module>:11 - this is a debug message
2021-04-27 17:56:29.254 | DEBUG | __main__:<module>:13 - this is another debug message
日誌檔案 runtime.log 內容如下:
2021-04-27 17:56:29.254 | DEBUG | __main__:<module>:13 - this is another debug message
可以發現,在呼叫 remove 方法之後,確實將歷史 log 刪除了。但實際上這並不是刪除,只不過是將 sink 物件移除之後,在這之前的內容不會再輸出到日誌中。 這樣就可以實現日誌的重新整理重新寫入操作。
rotation 配置
用了 loguru 可以非常方便地使用 rotation 配置,比如想一天輸出一個日誌檔案,或者檔案太大了自動分隔日誌檔案,可以直接使用 add 方法的 rotation 引數進行配置。
logger.add('runtime_{time}.log', rotation="500 MB") # log檔案超過500M時會新建一個log檔案
使用 rotation 引數實現定時建立 log 檔案
logger.add('runtime_{time}.log', rotation='00:00') # 每天0點新建一個log檔案
retention 配置
retention 這個引數可以配置日誌的最長保留時間。
logger.add('runtime.log', retention='10 days') # 保留最新10天的log
compression 配置
配置檔案的壓縮格式
logger.add('runtime.log', compression='zip') # 使用zip檔案格式儲存
字串格式化
logger.info('If you are using Python {}, prefer {feature} of course!', 3.6, feature='f-strings')
Traceback 記錄
使用裝飾器 @logger.catch 可以在日誌裡記錄 Traceback 資訊
@logger.catch
def my_function(x, y, z):
# An error? It's caught anyway!
return 1 / (x + y + z)
參考:官方文件
本文來自部落格園,作者:胡圖人,轉載請註明原文連結:https://www.cnblogs.com/huturen/p/15345056.html