目录
logging日志模块
在写代码或者测试程序的时候 需要调试一下 经常要print输出看看 对不对 但是当需要查看大量信息时 或者要保存到文件中 print就u不适用了 使用logging日志模块可以及那个输出的日志信息保存下来
logging模式使用基本结构
先写一个简单的logging日志 代码看一下 它的结构是怎样的
首先导入该模块 然后调用方法 在方法传递参数 (basicConfig的参数是关键字动态参数**kwargs)
下方代码中 basicConfig 传递两个参数 level: 日志的级别 filename:日志保存的路径
最后输出日志内容
import logging#导入日志模块
logging.basicConfig(
level=logging.INFO, #设置日志的级别
filename="data/log.log"#日志保存的位置
)
logging.info("调试日志")#日志输出的内容
执行完成后在data目录下 找到并打开log.log文件 就会看到输出的内容 (注意: 查看日志是编码是GBK 如果是UTF-8可能会乱码)
日志的级别
级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG
级别的含义:
debug : 输出全部的日志,详细的信息 一般是调试
info : 打印info,warning,error,critical级别的日志,确认一切按预期运行
WARNING :打印warning,error,critical级别的日志程序未按预期运行时使用,但并不是错误,
ERROR :打印error,critical级别的日志,更严重的问题 程序出错误时使用,如:IO操作失败
CRITICAL : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行
输入不同级别的日志
输出一下 不同级别日志的效果
import logging
logging.debug("deDUB")
logging.info("info ")
logging.warning("warning")
logging.error("error")
logging.critical("critical")
>>>WARNING:root:warning
>>>ERROR:root:error
>>>CRITICAL:root:critical
可以看到 在 控制台中 只输出了 高于warning级别的日志 低于warning级别的就不在控制台输出了 只能记录在文件中查看
将低级别日志也输出到控制台
如果想使用低级别的日志 输出到控制台去做调试 ,level 可以引入NOTSET级别来显示:
import logging#导入日志模块
logging.basicConfig(
level=logging.NOTSET, #设置日志的级别
)
logging.debug("调试日志")#日志输出的内容
>>>调试日志
将级别设置成NOTSET 后 低级别的 日志也可以输出在控制台中了
format日志的内容格式
参数 | 内容 |
---|---|
message | 日志内容 |
asctime | 日志时间 |
levelname | 日志的等级 |
filename | 文件名 |
lineno | 文件中的行号 |
时间显示
之前输出的日志 没有时间日期 所以在以后查看的时候 会不太友好 因此需要在日志内加上时间格式
输入当前日期到控制台中
basicConfig 再传递一个参数format :格式化一个时间模块
import logging#导入日志模块
logging.basicConfig(
level=logging.NOTSET, #设置日志的级别
format="%(asctime)s"#日志的时间格式
)
logging.debug("日志内容")#日志输出的内容
>>>2020-05-19 14:06:35,750
上面就输出了当前的时间
输出时间和日志内容
上面只能输出时间 现在需要将时间和日志的内容一起输出出来
在format后加上message 控件指定消息框所显示的消息
import logging#导入日志模块
logging.basicConfig(
level=logging.NOTSET, #设置日志的级别
format="%(asctime)s: %(message)s"#日志的时间格式和日志内容
)
logging.debug("日志内容")#日志输出的内容
>>>2020-05-19 15:08:26,221: 日志内容
输出日志等级
在输出的日志格式中增加日志的等级 basicConfig的参数format加上%(levelname)s 即可
import logging#导入日志模块
logging.basicConfig(
level=logging.NOTSET, #设置日志的级别
format="%(asctime)s: %(levelname)s: %(message)s"#日志的时间格式 日志等级 日志内容
)
logging.debug("日志内容")#日志输出的内容
>>>2020-05-19 15:55:20,970: DEBUG: 日志内容
输入该日志所在行
在日志增加所在行 更利于查询问题所在
在输出的日志格式中增加日志的等级 basicConfig的参数format加上lineno 即可
import logging#导入日志模块
logging.basicConfig(
level=logging.NOTSET, #设置日志的级别
format="%(asctime)s: %(levelname)s: %(lineno)s %(message)s"#日志的时间格式 日志等级 日志内容及所在行
)
logging.debug("日志内容")#日志输出的内容
>>>2020-05-19 18:07:15,238: DEBUG: 17 日志内容
输出 日志内容在17行
通过现在的输出的日志就可以看出在什么时间 发生什么等级的事件 在哪一行 什么内容
这样的日志就比较清晰了
以上已经完成了日志记录的基本用法 现在就在接口测试中进行运用一下
在接口测试中使用日志记录
测试一个接口将结果输出到日志中
发送正常的接口请求
import logging#导入日志模块
import requests
logging.basicConfig(
level=logging.NOTSET, #设置日志的级别
filename=("data/log.log"),
format="%(asctime)s: %(levelname)s:%(lineno)s %(message)s"
)
# logging.debug("日志内容")#日志输出的内容
def test_API():
r = requests.post(
"http://127.0.0.1:5000/index/info",
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}
)
logging.info(r.status_code)#将响应状态码输出到日志中
logging.info(r.json()['msg'])#将msg字段对应的值输出到日志中
test_API()
然后打开data目录下的log文件
2020-05-20 11:59:31,546: DEBUG:205 Starting new HTTP connection (1): qgyilingmuyan.com:80
2020-05-20 11:59:31,635: DEBUG:393 http://127.0.0.1:5000 "POST /index/info HTTP/1.1" 200 None
2020-05-20 11:59:31,648: INFO:17 200
2020-05-20 12:07:38,121: INFO:18 获取成功
日志中显示响应状态码是200 msg字段对应的值是:获取成功
发送一个错误的请求
上面试过了正常的发送API请求 查看日志是正常的 那么现在试试故意把请求地址改错看看 日志输出
请求地址改错一个字符 看看
import logging#导入日志模块
import requests
logging.basicConfig(
level=logging.NOTSET, #设置日志的级别
filename=("data/log.log"),
format="%(asctime)s: %(levelname)s:%(lineno)s %(message)s"
)
# logging.debug("日志内容")#日志输出的内容
def test_API():
r = requests.post(
"http://127.0.0.2:5000/ndex/info",
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}
)
logging.info(r.status_code)
logging.info(r.json()['msg'])
test_API()
再次打开日志文件 可以看到响应状态码是404
2020-05-20 12:22:52,316: DEBUG:205 Starting new HTTP connection (1):127.0.0.1:5000
2020-05-20 12:22:52,376: DEBUG:393 http://127.0.0.1:5000 "POST ndex/info HTTP/1.1" 404 None
2020-05-20 12:22:52,380: INFO:17 404
上面错误的请求 只能输出状态码 现在想要把控制台中的报错信息也输出到日志中
将报错的信息输出到日志中
把可能出错的代码放在try中 然后 捕获异常 将出错的信息记录下来
import logging#导入日志模块
import requests
logging.basicConfig(
level=logging.INFO, #设置日志的级别
filename=("data/log.log"),
format="%(asctime)s: %(levelname)s:%(lineno)s : %(message)s"
)
# logging.debug("日志内容")#日志输出的内容
def test_API():
try:
r = requests.post(
"http://127.0.0.1:5000/indeX/info",
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}
)
logging.info(r.status_code)
logging.info(r.json())
except Exception as e:
logging.error("出错",exc_info = 1)#记录报错的信息
test_API()
再次打开log文件 就可以看到报错信息了
2020-05-20 14:12:03,397: INFO:18 : 404
2020-05-20 14:12:03,400: ERROR:21 : 出错
Traceback (most recent call last):
File "D:/demo2/day1/TCP.py", line 19, in test_API
logging.info(r.json())
File "C:\Users\root\AppData\Local\Programs\Python\Python37\lib\site-packages\requests\models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "C:\Users\root\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "C:\Users\root\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\root\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)