Python 中 對 logging 模塊進行封裝,記錄bug日志、日志等級


  • 是程序產生的日志
  • 程序員自定義設置的
  • 收集器和渠道級別那個高就以那個級別輸出
  • 日志和報告的作用:
    • 報告的重點在於執行結果(執行成功失敗,多少用例覆蓋),返回結果  
    • 日志的重點在執行過程當中,異常點,哪里失敗,哪里報錯,診斷代碼  

logging 模塊的基本使用

import logging  # Python內置的日志模塊

# 1. 定義日志收集器,使用.getLogger(譯:老哥兒)方法,收集器的名字case
case_logger = logging.getLogger("case")  # 會創建一個 Logger 對象

# 2. 指定日志收集器的日志等級,使用 logging 對象中.setLevel (譯:賽特。萊歐)方法
# NOTSET(0), DEBUG(10), INFO(20)--, WARNING(30), ERROR(40), CRITICAL(50)

# 方法一 setLevel(賽特。萊歐)
# case_logger.setLevel(logging.DEBUG)   # 只能收集當前等級和當前等級以上級別的日志
# 方法二 setLevel(賽特。萊歐)
case_logger.setLevel("DEBUG")

# 3. 定義日志輸出渠道
# 輸出到控制台,使用 logging(老根)當中的.StreamHandler(絲錐木汗都)
console_handle = logging.StreamHandler()     # Handler對象

# 輸出到文件,使用 logging(老根)當中的.FileHandler(發偶。憨豆)方法,(指定文件名, 默認a以追加的方式,)
file_handle = logging.FileHandler("cases.log", encoding="utf-8")

# 4. 指定日志輸出渠道的日志等級,使用對象.setLevel(賽特。萊歐)方法
console_handle.setLevel(logging.ERROR)
file_handle.setLevel(logging.INFO)

# 5. 定義日志顯示的格式,logging(老根)當中的 Formatter(佛梅特) 函數
# 簡單點的格式
simple_formatter = logging.Formatter('%(asctime)s - [%(levelname)s] - [msg]: %(message)s')
# 詳細的格式
verbose_formatter = logging.Formatter('%(asctime)s - [%(levelname)s] - [msg]: %(message)s - %(name)s - %(lineno)d')

# 控制台顯示簡潔的日志,setFormatter(賽特否梅特)函數
console_handle.setFormatter(simple_formatter)
# 日志文件中顯示詳細日志
file_handle.setFormatter(verbose_formatter)

# 6. 對接, 將日志收集器與輸出渠道對接,收集器中 addHandler(按得,憨豆)函數
case_logger.addHandler(console_handle)
case_logger.addHandler(file_handle)

日志等級

  • NOTSET(0):(譯:鬧特賽特):相當沒級別
  • DEBUG(10):(譯:滴bug):在調試階段,業務系統還沒有上線,僅僅是用來調試
  • INFO(20):(譯:in否):正常的提示信息,普通的提示信息,比如返回的狀態嗎
  • WARNING(30):(譯:外流):警告,沒有錯,不會導致系統中斷,程序正常進行,會出現某個警告;某一個模塊回不可用
  • ERROR(40):(譯:哎歪):系統出現錯誤,影響系統功能
  • CRITICAL(50):(譯:快特扣):最嚴重的的錯誤,會導致程序中斷

日志顯示的格式

  • %(asctime)s :顯示時間
  • %(created)f:創建日期
  • %(filename)s : 日志的名稱
  • %(funcName)s : 函數的名稱
  • %(levelname)s : 日志等級
  • %(levelno)s:日志級別
  • %(lineno)d : 報錯行號
  • %(message)s : 具體的日志詳情信息
  • %(module)s : 那個模塊的報錯
  • %(name)s : 收集器的名字

 

 

logging 模塊的封裝

# 封裝處理日志的類
import logging
from danyuan.handle_config import do_config     # 從配置文件中獲取


class HandleLog:
    """
    封裝處理日志的類
    """
    def __init__(self):
        # 1. 定義日志收集器
        self.case_logger = logging.getLogger(do_config.get_value("log", "logger_name"))

        # 2. 指定日志收集器的日志等級
        self.case_logger.setLevel(do_config.get_value("log", "logger_level"))

        # 3. 定義日志輸出渠道
        console_handle = logging.StreamHandler()  # 定義日志輸出到控制台
        file_handle = logging.FileHandler(do_config.get_value("log", "log_filename"), encoding="utf-8")     # 定義日志輸出到文件

        # 4. 指定日志輸出渠道的日志等級
        console_handle.setLevel(do_config.get_value("log", "console_level"))
        file_handle.setLevel(do_config.get_value("log", "file_level"))

        # 5. 定義日志顯示的格式
        simple_formatter = logging.Formatter(do_config.get_value("log", "simple_formatter"))    # 簡單點的格式
        verbose_formatter = logging.Formatter(do_config.get_value("log", "verbose_formatter"))  # 詳細的格式

        console_handle.setFormatter(simple_formatter)   # 控制台顯示簡潔的日志
        file_handle.setFormatter(verbose_formatter)     # 日志文件中顯示詳細日志

        # 6. 對接, 將日志收集器與輸出渠道對接
        self.case_logger.addHandler(console_handle)
        self.case_logger.addHandler(file_handle)

    def get_logger(self):
        """
        獲取logger日志對象
        :return:
        """
        return self.case_logger


# do_log = HandleLog().get_logger()       # 實例化對象

if __name__ == '__main__':
    do_log = HandleLog()
    case_logger = do_log.get_logger()
    case_logger.debug("這是一個debug級別的日志")  # 手動記錄日志
    case_logger.info("這是一個info級別的日志")
    case_logger.warning("這是一個warning級別的日志")
    case_logger.error("這是一個error級別的日志")
    case_logger.critical("這是一個critical級別的日志")

 

補充:

1、根據日志文件的大小和個數,來自動生成和清理日志文件

2、根據時間來生成日志文件

import time
import logging
from logging import handlers


# ========1、 創建一個日志收集器
logger = logging.getLogger("py43")
# 指定日志級別
logger.setLevel(logging.INFO)

# ========2、 創建一個文件輸出渠道
# 實例化一個文件渠道類, [如果日志當中有中文,要指定編碼格式為utf-8]
# handle2 = logging.FileHandler("my_first_log.log", encoding="utf-8")

# 根據日志文件的大小和個數,來自動生成和清理日志文件。1024 = 1KB
# handle2 = handlers.RotatingFileHandler("my_log_by_filesize.log", encoding="utf-8",maxBytes=1024,backupCount=10)

# 根據時間來生成日志文件。when代表時間單位,interval代表周期。比如when=h, interval=2,表示2小時生成一個日志文件。
handle2 = handlers.TimedRotatingFileHandler("my_log_by_when.log", encoding="utf-8",when="s",backupCount=10)

# ===========3、設計日志的格式
fmt = '%(asctime)s %(levelname)s %(filename)s 【行號:%(lineno)d】:%(message)s'
formatter = logging.Formatter(fmt)

# ============4、設置輸出渠道的,日志格式
handle2.setFormatter(formatter)

# ========5、將輸出渠道,綁定到日志收集器上 ============
logger.addHandler(handle2)

for _ in range(100):
    time.sleep(0.1)
    logger.info("111111111111111111111111111111111111111111111111111111111111111111")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM