python - 日志處理(logging模塊)


什么是日志?

日志是一種可以追蹤某些軟件運行時所發生事件的方法。通過log的分析,可以方便用戶了解系統或軟件、應用的運行情況。

我們通過記錄和分析日志可以了解一個系統或軟件程序運行情況是否正常,也可以在應用程序出現故障時快速定位問題。

測試中老是說要找日志,為啥找日志,就是通過日志開發可以快速找到哪里的代碼塊出了問題。
在自動化測試中,我們也可以使用日志模塊進行記錄以及問題的快速查找。



logging模塊簡介

Python提供了一個用於記錄日志的標准庫模塊logging,由標准庫模塊提供日志記錄API的關鍵好處是所有Python模塊都可以使用這個日志記錄功能。



logging日志級別

logging模塊日志級別有DEBUG、INFO、WARNING、ERROR、CRITICAL五種。

  • DEBUG - 調試模式,應用場景是問題診斷;
  • INFO - 通常只記錄程序中一般事件的信息,用於確認工作一切正常;
  • WARNING - 打印警告信息,系統還在正常運行;
  • ERROR - 錯誤導致某些功能不能正常運行時記錄的信息;
  • CRITICAL - 當發生嚴重錯誤,導致應用程序不能繼續運行時記錄的信息;

日志等級是從上到下一次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次減少的。


logging日志最簡使用

import logging

logging.debug("這條日志是debug級別")
logging.info("這條日志是info級別")
logging.warning("這條日志是warning級別")
logging.error("這條日志是error級別")
logging.critical("這條日志是critical級別")

"""
WARNING:root:這條日志是warning級別
ERROR:root:這條日志是error級別
CRITICAL:root:這條日志是critical級別
"""

通過結果,你會發現調用debug()和info()方法沒有輸出任何信息,這是因為默認的日志級別是ERROR,
上面我們說了調用比級別低的日志記錄函數不會輸出任何信息,所以低於ERROR級別的日志不會輸出。


所以下面直接封裝日志模塊

日志放哪里?由寫代碼的人決定的,直接問即可。

import logging, time, os

# 當前路徑
BASE_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
# 定義日志文件路徑
LOG_PATH = os.path.join(BASE_PATH, "log")
if not os.path.exists(LOG_PATH):
    os.mkdir(LOG_PATH)


class Logger():

    def __init__(self):
        self.logname = os.path.join(LOG_PATH, "{}.log".format(time.strftime("%Y-%m-%d")))  # 日志的名稱
        self.logger = logging.getLogger("log")
        self.logger.setLevel(logging.DEBUG)

        self.formater = logging.Formatter(
            '[%(asctime)s][%(filename)s %(lineno)d][%(levelname)s]: %(message)s')

        self.filelogger = logging.FileHandler(self.logname, mode='a', encoding="UTF-8")
        self.console = logging.StreamHandler()
        self.console.setLevel(logging.DEBUG)
        self.filelogger.setLevel(logging.DEBUG)
        self.filelogger.setFormatter(self.formater)
        self.console.setFormatter(self.formater)
        self.logger.addHandler(self.filelogger)
        self.logger.addHandler(self.console)


if __name__ == '__main__':
    logger = Logger().logger
    logger.info("---測試開始111---")
    logger.debug("---測試結束222---")


"""
[2021-11-23 22:31:30,366][my_log.py 33][INFO]: ---測試開始111---
[2021-11-23 22:31:30,366][my_log.py 34][DEBUG]: ---測試結束222---
"""


栗子

日志模塊在自動化中的使用

import requests
from log_test.my_log import Logger
logger = Logger().logger
weather_key = ""


def weather(city, key):
    url = "http://apis.juhe.cn/simpleWeather/query"
    par = {
        "city": city,
        "key": key
    }
    r = requests.get(url=url, params=par)
    return r


if __name__ == '__main__':
    logger.info("---測試查詢天氣接口---")
    res = weather("深圳", weather_key)
    print(res.text)

"""
[2021-11-23 22:39:49,524][weather.py 18][INFO]: ---測試查詢天氣接口---
"""


在操作數據中的使用:
def search_data_fetchone(self, sql):
    '執行sql語句,從結果中取出一行數據(字典格式)'
    cursor = self._con.cursor(cursor=pymysql.cursors.DictCursor)
    try:
        cursor.execute(sql)  # 執行sql語句
        result = cursor.fetchone()  # 使用游標獲取第一行的數據(返回數據字典)
    except:
        self.log.log_info("Error: unable to fetch data one")
    finally:
        cursor.close()  # 關閉游標
    return result


免責聲明!

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



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