前言:
在任何一个软件开发过程中,日志记录都是一个必须要做的事。记录日志,有助于问题排查,后续的大数据统计也要需要使用日志提供原始数据。
Python日志库:
logging --- Python 的日志记录工具 这是Python官方提供的日志记录库。优点在于不用安装,直接导入使用即可。
日志等级:
在使用python记录日志前,需要先了解一下什么叫日志等级。还有就是为什么要分等级。首先说明一下,日志等级就是日记录中过程中对输出数据的一个定义,日志分等级的好处在于容易查找和根据等级对日志进行统计,然后分析系统可能存在的问题,比如有一个日志文件,里面有一半是ERROR等级的记录,那么是不是可以反映出系统设计存在问题?日志等级通常可以分为以下几类:
DEBUG:程序调试bug时使用
INFO:程序正常运行时使用
WARNING:程序未按预期运行时使用,但并不是错误,如:用户登录密码错误
ERROR:程序出错误时使用,如:IO操作失败
CRITICAL:特别严重的问题,导致程序不能再继续运行时使用,如:磁盘空间为空,一般很少使 用
在生产环境中一般只需要使用INFO,WARNING,ERROR三个类别来记录就可以满足记录日志的需求。至于什么时候需要使用哪种,这个要配合实际的代码来选择。
logging尝试:
在pycharm中新建一个LogTest.py文件,将以下代码复制进去并运行:
# -*- coding: utf-8 -*-
import logging
#配置日志文件
logging.basicConfig(
filename='example.log',#保存的文件名
level=logging.DEBUG,
datefmt='[%Y-%m-%d%H:%M:%S]',#日期格式
format='%(asctime)s%(levelname)s%(filename)s[%(lineno)d]%(threadName)s:%(message)s',#保存数据格式
)
logging.debug('这个是调试时记录的日志信息')
logging.info('程序正常运行时记录的日志信息')
logging.warning('程序警告记录的信息')
logging.critical("特别严重的问题")
logging.error("程序错误时的记录,比如网络请求过慢等")
运行结果:
部份参数说明:
"""
format格式设置说明:
asctime:日期信息
levelname:日志等级
filename:当前执行程序的文件名
lineno:程序运行的行数
threadName:线程名称
message:具体的描述信息
"""
返回结果:
[2020-12-10 11:21:37] DEBUG LogTest.py [11] MainThread : 这个是调试时记录的日志信息
[2020-12-10 11:21:37] INFO LogTest.py [12] MainThread : 程序正常运行时记录的日志信息
[2020-12-10 11:21:37] WARNING LogTest.py [13] MainThread : 程序警告记录的信息
[2020-12-10 11:21:37] CRITICAL LogTest.py [14] MainThread : 特别严重的问题
[2020-12-10 11:21:37] ERROR LogTest.py [15] MainThread : 程序错误时的记录,比如网络请求过慢等
返回结果说明:
[2020-12-10 11:21:37] 日志记录时间
DEBUG 日志等级
LogTest.py 执行的文件名
[11] 代码行数
MainThread 主线程
: 冒号后面就是你记录的数据
在实际项目中使用:
以我们前两章的http接口测试demo为例,配合一起使用,在pycharm中记新建一个Request.py文件,复制以下代码并运行:
import requests
import pandas
import time
import logging
#http请求demo
def GetTest():
#接口请求
url="https://openapi.dvr163.com/message/nonce"
Param={ # 传递的参数,字典类型,所有参数写在这里即可
"method":"get"
}
logging.info("发起Get请求,获取接口参数")
Rque=requests.get(url,Param) # 发起Get请求
logging.info("请求成功")
#测试数据
data={
"Interface":"获取服务器验证码", #接口名称
"time":time.strftime('%Y-%m-%d_%H:%M:%S', time.localtime(time.time())), #测试时间,这里使用格式化时间,
"StatusCode":[Rque.status_code] ,#接口响应状态码
"Responseime":[Rque.elapsed.total_seconds()],#接口响应时间
"Response DATA": Rque.text, #响应的数据,这里建议使用text,因为不是每个接口都返回json格式
"Request body": Rque.request.body, # 发送的数据,get请求的数据会在url中
"Url": Rque.url, # 请求的url
#更多参数请自行添加
}
logging.info("测试数据写入csv文件中")
#写入csv中,以下两行代码建议封装成函数
dataCSV = pandas.DataFrame(data)
dataCSV.to_csv("chen.csv", index=False, mode="a", header=False, encoding="GBK")
logging.info("写入csv文件成功")
if __name__ == '__main__':
logging.basicConfig(
filename='./example.log',
level=logging.DEBUG,
datefmt='[%Y-%m-%d%H:%M:%S]',
format='%(asctime)s%(levelname)s%(filename)s[%(lineno)d]%(threadName)s:%(message)s',
)
GetTest()
运行结果:
说明一下:
在记录日志过程中,需要配置日志文件的输出路径,输出格式这些参数。如果只是单个py文件,则可以直接写在函数里面,但是项目分为多个模块时,不可能每个函数都配置一次,这样是不利于代码维护的。因此,在主函数中设置即可,logging只需在主函数中设置一次即可,而那些被调用的模块不需要设置,所以在主文件的if __name__ =='__main__':里面把配置信息设置即可,其他模块只需直接导入使用。