1. 程式人生 > 其它 >Python日誌管理模組loguru

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引數可以傳入多種不同的資料結構,如下:

  1. sink 可以傳入一個 file 物件,例如 sys.stderr 或者 open('file.log', 'w') 都可以。
  2. sink 可以直接傳入一個 str 字串或者 pathlib.Path 物件,其實就是代表檔案路徑的,如果識別到是這種型別,它會自動建立對應路徑的日誌檔案並將日誌輸出進去。
  3. sink 可以是一個方法,可以自行定義輸出實現。
  4. sink 可以是一個 logging 模組的 Handler,比如 FileHandler、StreamHandler 等等,或者上文中我們提到的 CMRESHandler 照樣也是可以的,這樣就可以實現自定義 Handler 的配置。
  5. 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