一. 日志的作用
- 日志是对软件执行时所发生事件的一种追踪方式,无论是开发人员还是测试人员,日志的重要的作用应该是不言而喻的;不但可以帮助开发定位缺陷解决问题,也可以辅助在测试过程中的测试工程师定位缺陷。
作为测试人员更应该重视日志,无论是单元测试去捕获Traceback
,还是做接口/UI自动化
都应当输出有必要的日志
本文首发自伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!
- 那么
python
中,怎么可以做到一个算是标准的日志记录呢? 很多人会使用print
直接输出的方式,但是其实这事极为不规范的做法,来看看官网上怎么说
截图来自官网 - 今天就来简单的介绍下
python logging
模块的基本使用方法
二. 日志的级别
- 5个级别分别是,可以注意到源码中,
WARN = WARNING
,后续使用中两者是一个意思
截图来自官网 -
每个级别都有对应的一个值
三. logging的工作流程
-
还是先来看看官网上的流程图
截图来自官网 - 可以看到以下几种类型,
Logger、LogRecord、Filter、Handler、Formatter
-
Logger
:是进行日志记录时创建的对象 -
LogRecord
:日志记录器,将日志传到相应的处理器处理 -
Handler
:即用来处理日志记录的类 -
Filter
:过滤器 -
Formatter
:格式化器, 指明了最终输出中日志记录的布局
四. 简单的例子
# 伊洛Yiluo
# https://yiluotalk.com
import logging
logging.debug('调试信息')
logging.info('信息消息')
logging.warning('错误:config file %s not found', 'server.conf')
logging.error('发生错误')
logging.critical('关键错误')
- 看以下输出结果
WARNING:root:错误:config file server.conf not found
ERROR:root:发生错误
CRITICAL:root:关键错误
Process finished with exit code 0
五. basicConfig() 使用方法
-
basicConfig()
主要做一些基础的配置 - 我们将日志的结果输出到一个名为
"test.log"
的文件
# 伊洛Yiluo
# https://yiluotalk.com
import logging
logging.basicConfig(filename="test.log", filemode="w", level=logging.DEBUG)
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')
- 打开
"test.log"
文件
DEBUG:root:This is a debug message
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message
-
filename
:即日志输出的文件名 -
filemode
:这个是指定日志文件的写入方式 -
format
:指定日志信息的输出格式 -
datefmt
:指定时间的输出格式 -
level
:指定日志输出的类别
六. 自定义 Logger
- 定义一个
Logger
,名字为test_log
, 通常默认为__name__
# 伊洛Yiluo
# https://yiluotalk.com
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger('test_log')
logger.info('info log1')
logger.debug('debug log')
logger.warning('warning log')
logger.info('info log2')
logger.info('info log3')
logger.critical('critical log')
- 查看文件的日志结果
2020-02-13 09:49:51,040 - test_log - INFO - info log1
2020-02-13 09:49:51,040 - test_log - WARNING - warning log
2020-02-13 09:49:51,040 - test_log - INFO - info log2
2020-02-13 09:49:51,040 - test_log - INFO - info log3
2020-02-13 09:49:51,040 - test_log - CRITICAL - critical log
七. 设置等级
- 设置等级为
WARNING
,打印出包括这个等级及这个等级之上级别的日志
# 伊洛Yiluo
# https://yiluotalk.com
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger('test_log')
logger.setLevel(level=logging.WARNING)
logger.info('info log1')
logger.debug('debug log')
logger.warning('warning log')
logger.info('info log2')
logger.info('info log3')
logger.critical('critical log')
- 如下按照等级打印出了日志的信息
2020-02-13 10:04:57,325 - test_log - WARNING - warning log
2020-02-13 10:04:57,325 - test_log - CRITICAL - critical log
Process finished with exit code 0
八. Handler 的使用
- 重新记录一个日志的文件名为
'test_log.log'
# 伊洛Yiluo
# https://yiluotalk.com
import logging
logger = logging.getLogger('test_log')
logger.setLevel(level=logging.DEBUG)
handler = logging.FileHandler('test_log.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info('info log1')
logger.debug('debug log')
logger.warning('warning log')
logger.info('info log2')
logger.info('info log3')
logger.critical('critical log')
- 查看日志文件的结果为
2020-02-13 10:44:55,888 - test_log - INFO - info log1
2020-02-13 10:44:55,888 - test_log - DEBUG - debug log
2020-02-13 10:44:55,889 - test_log - WARNING - warning log
2020-02-13 10:44:55,889 - test_log - INFO - info log2
2020-02-13 10:44:55,889 - test_log - INFO - info log3
2020-02-13 10:44:55,889 - test_log - CRITICAL - critical log
九. 多个handler
- 一个
handler
输出到控制台
,一个handler
输出到日志文件
# 伊洛Yiluo
# https://yiluotalk.com
import logging
import sys
logger = logging.getLogger('test_log')
logger.setLevel(level=logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 输出到控制台的handler
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(level=logging.INFO)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# 输出到文件的handler
file_handler = logging.FileHandler('test_log.log')
file_handler.setLevel(level=logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.info('info log1')
logger.debug('debug log')
logger.warning('warning log')
logger.info('info log2')
logger.info('info log3')
logger.critical('critical log')
- 输出都控制台
2020-02-13 11:05:49,000 - test_log - INFO - info log1
2020-02-13 11:05:49,001 - test_log - WARNING - warning log
2020-02-13 11:05:49,001 - test_log - INFO - info log2
2020-02-13 11:05:49,001 - test_log - INFO - info log3
2020-02-13 11:05:49,001 - test_log - CRITICAL - critical log
- 输出到日志
2020-02-13 11:06:54,721 - test_log - INFO - info log1
2020-02-13 11:06:54,722 - test_log - WARNING - warning log
2020-02-13 11:06:54,722 - test_log - INFO - info log2
2020-02-13 11:06:54,722 - test_log - INFO - info log3
2020-02-13 11:06:54,722 - test_log - CRITICAL - critical log
待续文件配置,配置共享等......
关注公众号获取更多内容欢迎下方【戳一下】【点赞】
Author:伊洛Yiluo
愿你享受每一天,Just Enjoy !
网友评论