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