logging 模块是 Python 内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比 print,具备如下优点
1、可以通过设置不同的日志等级,在 release 版本中只输出重要信息,而不必显示大量的调试信息
2、print 将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging 则可以由开发者决定将信息输出到什么地方,以及怎么输出
DEBUG < INFO < WARNING < ERROR < CRITICAL
logging 模块可以指定日志记录器的日志级别,只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃
logger:日志对象,logging 模块中最基础的对象,用 logging.getLogger(name) 方法进行初始化,name 可以不填。通常 logger 的名字我们对应模块名,如聊天模块、数据库模块、验证模块等
为程序提供记录日志的接口
判断日志所处级别,并判断是否要过滤
根据其日志级别将该条日志分发给不同 handler
其常用函数有:
Logger.setLevel() 设置日志级别
Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个 Handler
Logger.addFilter() 添加一个 Filter
setLevel:设置日志等级
logger=logging.getLogger()
logger.setLevel(logging.DEBUG) # 设置日志等级
logging.Formatter(参数)
formatter=logging.Formatter('[%(asctime) s]-%(filename) s]-%(levelname) s:%(message) s')
常用函数有:
创建一个 FileHandler,用于写到本地
fh=logging.FileHandler(logname,'a',"utf-8")
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)
创建一个 StreamHandler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)
import os,time,logging
#日志存放路径
log_path=os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))),'logs')
# 如果不存在这个logs文件夹,就自动创建一个
if not os.path.exists(log_path):os.mkdir(log_path)
class Log():
def __init__(self):
#在日志路径下添加日志文件名
self.logname=os.path.join(log_path,'%s.log'%time.strftime('%Y_%m_%d'))
#logger日志对象初始化
self.logger=logging.getLogger()
#设置日志等级
self.logger.setLevel(logging.DEBUG)
#日志输出格式
self.formatter=logging.Formatter('[%(asctime)s]-%(filename)s]-%(levelname)s:%(message)s')
def __console(self,level,message):
# 创建一个 FileHandler,用于写到本地
fh=logging.FileHandler(self.logname,'a',"utf-8")
fh.setLevel(logging.DEBUG)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh)
# 创建一个 StreamHandler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(self.formatter)
self.logger.addHandler(ch)
if level=='info':
self.logger.info(message)
elif level=='debug':
self.logger.debug(message)
elif level=='warning':
self.logger.warning(message)
elif level=='error':
self.logger.error(message)
# 这两行代码是为了避免日志输出重复问题
self.logger.removeHandler(ch)
self.logger.removeHandler(fh)
# 关闭打开的文件
fh.close()
def debug(self, message):
self.__console('debug', message)
def info(self, message):
self.__console('info', message)
def warning(self, message):
self.__console('warning', message)
def error(self, message):
self.__console('error', message)
if __name__ == "__main__":
log=Log()
log.info("---测试开始---")
log.info("操作步骤1,2,3")
log.warning("---测试结束---")
C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
[2019-04-10 17:17:18,025]-test.py]-INFO:---测试开始---
[2019-04-10 17:17:18,026]-test.py]-INFO:操作步骤1,2,3
[2019-04-10 17:17:18,028]-test.py]-WARNING:---测试结束---
Process finished with exit code 0