1. 程式人生 > 實用技巧 >python更方便高效的日誌管理loguru

python更方便高效的日誌管理loguru

對比使用logging模組手動封裝使用,配置複雜麻煩,發現一個loguru模組,使用更方便簡單。

1、安裝

pip install loguru

2、匯入及日誌輸出控制檯

#匯入模組
from loguru import logger

#直接呼叫方法即可

logger.debug('測試一下')
logger.error('錯誤測試')

執行,在控制檯輸出效果圖,預設輸出格式如下:

包括時間、日誌級別、模組名、行號、日誌內容

3、日誌輸出到檔案

from loguru import logger
logger.add('runtime_{time}.log', rotation='00:00')  #將結果輸出到檔案裡(當前目錄下),檔案命名按照當前時間命名,並且設定roation——每天0點新增一個日誌 logger.debug('測試一下')

效果圖如下:

自定義輸出到檔案格式:

loguru官網的描述:https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.add

引數說明

  • sink:支援多種資料結構,可以傳入一個字串、一個檔案物件、一個路徑物件代表路徑、一個方法、logging模組的Handler
  • level:預設為debug型別
  • format:輸出格式設定

說明:一般可能修改的是sink,其他與logging模組的一樣,可參考logging模組中自定義配置

這裡舉例sink為一個路徑物件,進行操作:

1)建立路徑物件(set_path.py)

import os
import datetime

class Projectpath:
  #建立日誌路徑
  root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  #獲取專案的根目錄
  log_path=os.path.join(root_path,'Log')  #定義存放log的資料夾Log
  filename = os.path.join(log_path, '{}.log'.format(datetime.date.today()))  #設定日誌檔名字,按照時間格式譬如2020-10-20.log命名
  if not os.path.exists(log_path):  #判斷資料夾Log是否存在,不存在進行建立
    os.mkdir(log_path)
     if not os.path.exists(filename):  #判斷日誌檔案是否存在,不存在進行建立
      with open(filename, mode='w', encoding='utf-8') as ff:
        print("日誌檔案建立成功!")

p_path=Projectpath()  #呼叫類

2)使用路徑物件結合loguru使用

import loguru
from set_path import p_path
if __name__=='__main__':
logger.add(sink=p_path.filename, rotation='00:00', encoding='utf-8')
logger.info('1020測試')

4、roation配置

4.1、配置根據檔案大小輸出日誌

logger.add('runtime_{time}.log', rotation="500 MB")  #配置檔案大小為500MB,超過會自動生成一個新日誌檔案

4.2、配置根據時間輸出日誌

logger.add('runtime_{time}.log', rotation='00:00')  #設定每天零點建立一個日誌檔案

logger.add('runtime_{time}.log', rotation='1 week')  #設定每隔一週建立一個日誌檔案

5、retention配置(配置日誌最長保留時間)

logger.add('runtime.log', retention='7 days')  #配置日誌檔案最長保留時間為7天

6、compression 配置(配置日誌檔案為壓縮格式)

logger.add('runtime.log', compression='zip')  #設定檔案格式壓縮為zip,節省空間

7、traceback(報錯回溯)

使用裝飾器,直接在函式或類前面加上@logger.catch

這裡舉例:

@logger.catch
def div(x,y):
    return x/y


test=div(4,0)

若執行報錯,在日誌中會出現tarceback資訊,顯示效果圖如下: