1. 程式人生 > 實用技巧 >python的logging模組及應用

python的logging模組及應用

一、logging日誌模組等級

常見log級別從高到低:

CRITICAL 》ERROR 》WARNING 》INFO 》DEBUG,預設等級為WARNING即>=WARNING級別的log才輸出。

日誌等級(level) 描述
CRITICAL 當發生嚴重錯誤,導致應用程式不能繼續執行時記錄的資訊
ERROR 由於一個更嚴重的問題導致某些功能不能正常執行時記錄的資訊
WARNING 當某些不期望的事情發生時記錄的資訊(如,磁碟可用空間較低),但是此時應用程式還是正常執行的
INFO 資訊詳細程度僅次於DEBUG,通常只記錄關鍵節點資訊,用於確認一切都是按照我們預期的那樣進行工作
DEBUG 最詳細的日誌資訊,典型應用場景是 問題診斷

二、logging模組的使用方式介紹

logging模組提供了兩種記錄日誌的方式:

  • 第一種方式是使用logging提供的模組級別的函式
  • 第二種方式是使用Logging日誌系統的四大元件

其實,logging所提供的模組級別的日誌記錄函式也是對logging日誌系統相關類的封裝而已。

(1)logging模組定義的模組級別的常用函式

函式說明
logging.debug(msg, *args, **kwargs) 建立一條嚴重級別為DEBUG的日誌記錄
logging.info(msg, *args, **kwargs) 建立一條嚴重級別為INFO的日誌記錄
logging.warning(msg, *args, **kwargs) 建立一條嚴重級別為WARNING的日誌記錄
logging.error(msg, *args, **kwargs) 建立一條嚴重級別為ERROR的日誌記錄
logging.critical(msg, *args, **kwargs) 建立一條嚴重級別為CRITICAL的日誌記錄
logging.log(level, *args, **kwargs) 建立一條嚴重級別為level的日誌記錄
logging.basicConfig(**kwargs) 對root logger進行一次性配置

其中logging.basicConfig(**kwargs)函式用於指定“要記錄的日誌級別”、“日誌格式”、“日誌輸出位置”、“日誌檔案的開啟模式”等資訊,其他幾個都是用於記錄各個級別日誌的函式。

(2)logging模組的四大元件

元件說明
loggers 提供應用程式程式碼直接使用的介面
handlers 用於將日誌記錄傳送到指定的目的位置
filters 提供更細粒度的日誌過濾功能,用於決定哪些日誌記錄將會被輸出(其它的日誌記錄將會被忽略)
formatters 用於控制日誌資訊的最終輸出格式

三、自定義Logger模組類

# testLog1.py

import logging
import time

class Logger():

    def __init__(self, logger, level=logging.DEBUG):
        '''
     : 自定義Logger模組類
: logger: logger名 : level: 日誌級別 ''' # 建立一個logger self.logger = logging.getLogger(logger) self.logger.setLevel(level) # 定義handler的輸出格式 curr_time = time.strftime("%Y-%m-%d") self.LogFileName = 'log' + curr_time + '.txt' fmt = logging.Formatter('%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s') # asctime: 日誌事件發生的時間 # filename: 原始檔的名稱部分,包含檔案字尾 # lineno: 呼叫日誌記錄函式的原始碼所在的行號 # evelname: 該日誌記錄的文字形式的日誌級別 # message: 日誌記錄的文字內容 # 建立一個handler, 用於寫入日誌檔案 fh = logging.FileHandler(self.LogFileName) fh.setLevel(logging.DEBUG) fh.setFormatter(fmt) # 再建立一個handler,用於輸出到控制檯 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(fmt) # 給logger新增handler self.logger.addHandler(fh) self.logger.addHandler(ch) # level優先順序 # logger.setLevel > handler.setLevel > logging.basicConfig if __name__ == "__main__": log = Logger(__name__, level=logging.DEBUG) log.logger.debug('debug') log.logger.log(logging.DEBUG, 'debug')

# 執行testLog1.py,則控制檯輸出如下:
2020-08-03 20:36:47,104 - testLog1.py:[117] - [DEBUG] - debug
2020-08-03 20:36:47,104 - testLog1.py:[118] - [DEBUG] - debug

# 日誌檔案記錄如下:
2020-08-03 20:36:15,982 - testLog1.py:[117] - [DEBUG] - debug
2020-08-03 20:36:15,982 - testLog1.py:[118] - [DEBUG] - debug
# testLog2.py

from testLog1 import Logger
import traceback

log = Logger(__name__)
def func():
   try:
       assert 1==2
   except Exception:
       log.logger.info('測試失敗,輸出資訊如下:{}'.format(traceback.format_exc()))
    #
traceback.format_exc() 會返回異常資訊的字串 if __name__ == "__main__": func()

# 執行testLog2.py,則控制檯輸出如下:
2020-08-03 20:43:44,907 - testLog2.py:[11] - [INFO] - 測試失敗,輸出資訊如下:Traceback (most recent call last):
File "E:/imooc/testLog.py", line 9, in func
assert 1==2
AssertionError

# 日誌檔案記錄如下:
2020-08-03 20:43:44,907 - testLog2.py:[11] - [INFO] - 測試失敗,輸出資訊如下:Traceback (most recent call last):
File "E:/imooc/testLog.py", line 9, in func
assert 1==2
AssertionError

參考:https://www.cnblogs.com/yyds/p/6901864.html