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