【python】Logging模块
1.日志记录级别
logging.debug<logging.info<logging.warning<logging.error<logging.critical
关键是最高级别,debug是最低级别,即如果我们配置了“WARNING”的日志,我们的日志文件将包含WARNING,ERROR&CRITICAL的日志。默认日志消息是WARNING
2.模块提供logger,handler,filter,formatter
1)loger
提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。
2)handler
将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示
3)filter
提供一种优雅的方式决定一个日志记录是否发送到handler
4)formater
指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的
3.logger用法
1)始化 logger = logging.getLogger("endlesscode"),getLogger()方法后面最好加上所要日志记录的模块名字,后面的日志格式中的%(name)s 对应的是这里的模块名字
2)设置级别 logger.setLevel(logging.DEBUG),Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志
3) Handler,常用的是StreamHandler和FileHandler,windows下你可以简单理解为一个是console和文件日志,一个打印在CMD窗口上,一个记录在一个文件上
4) formatter,定义了最终log信息的顺序,结构和内容,我喜欢用这样的格式 '[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S',
%(name)s Logger的名字
%(levelname)s 文本形式的日志级别
%(message)s 用户输出的消息
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(levelno)s 数字形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
4.编写logger案例
1 import logging 2 3 #创建logger对象 4 logger=logging.getLogger(__name__) 5 logger.setLevel(logging.INFO) 6 7 #创建file handler 8 handler_warn=logging.FileHandler("warning_log.txt") 9 handler_warn.setLevel(logging.WARNING) 10 11 #handler_info=logging.FileHandler("info_log.txt") 12 #handler_info.setLevel(logging.INFO) 13 14 handler_info=logging.StreamHandler() 15 handler_info.setLevel(logging.INFO) 16 17 #创建日志记录格式 18 formatter=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s") 19 20 #设置handler格式 21 handler_warn.setFormatter(formatter) 22 handler_info.setFormatter(formatter) 23 24 #将handler添加至logger 25 logger.addHandler(handler_warn) 26 logger.addHandler(handler_info) 27 28 logger.info("testinfo") 29 logger.warning("testwarn") 30 logger.error("testerror") 31 logger.critical("testcritical")
执行结果:
控制台输出INFO信息,包括info,warning,error,critical
warning_log.txt包括warning.error,critical
若将logger设置为WARNING即,logger.setLevel(logging.WARNING),则控制台和txt中只显示WARNING及以上级别的信息
5.对logger进行封装
1 # coding:utf-8 2 import logging, time, os 3 # 这个是日志保存本地的路径 4 log_path = "E:\\automatic\\sc\\wdms_api\\log_module" 5 class Log: 6 def __init__(self): 7 # 文件的命名 8 self.logname = os.path.join(log_path, '%s.log'%time.strftime('%Y_%m_%d')) 9 self.logger = logging.getLogger() 10 self.logger.setLevel(logging.DEBUG) 11 # 日志输出格式 14 self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s] - %(levelname)s: %(message)s') 15 def __console(self, level, message): 16 #fh = logging.FileHandler(self.logname, 'a') # 追加模式 17 fh = logging.FileHandler(self.logname, 'a', encoding='utf-8') # 这个是python3的 18 fh.setLevel(logging.DEBUG) 19 fh.setFormatter(self.formatter) 20 self.logger.addHandler(fh) 21 # 创建一个StreamHandler,用于输出到控制台 22 ch = logging.StreamHandler() 23 ch.setLevel(logging.DEBUG) 24 ch.setFormatter(self.formatter) 25 self.logger.addHandler(ch) 26 if level == 'info': 27 self.logger.info(message) 28 elif level == 'debug': 29 self.logger.debug(message) 30 elif level == 'warning': 31 self.logger.warning(message) 32 elif level == 'error': 33 self.logger.error(message) 34 # 这两行代码是为了避免日志输出重复问题 35 self.logger.removeHandler(ch) 36 self.logger.removeHandler(fh) 37 # 关闭打开的文件 38 fh.close() 39 def debug(self, message): 40 self.__console('debug', message) 41 def info(self, message): 42 self.__console('info', message) 43 def warning(self, message): 44 self.__console('warning', message) 45 def error(self, message): 46 self.__console('error', message) 47 if __name__ == "__main__": 48 log = Log() 49 log.info("---测试开始----") 50 log.info("输入密码") 51 log.warning("----测试结束----")
6.封装后logger的使用案例
1 from selenium import webdriver 2 from selenium.webdriver.support import expected_conditions as EC 3 from log_module.log_module import Log 4 import time 5 import unittest 6 import json 7 import requests 8 log=Log() 9 class test_interface(unittest.TestCase): 10 def setUp(self): 11 pass 12 def tearDown(self): 13 pass 14 15 #获取url 16 def set_url(self,url): 17 self.url="http://127.0.0.1:8081/api/"+url 18 return self.url 19 20 #获取sessionid 21 def get_sessionid(self): 22 payload={"username":"admin","password":"admin"} 23 data_json=json.dumps(payload) 24 url1=self.set_url("accounts/login/") 25 #r=requests.post(url,data=data_json) 26 s=requests.session() 27 r1=s.post(url1, json=payload) 28 result=r1.json() 29 return r1.cookies 30 31 #登录接口 32 def test_login(self): 33 log.info("-------测试登录接口-------") 34 #u'测试登录接口' 35 payload={"username":"admin","password":"admin"} 36 data_json=json.dumps(payload) 37 url=self.set_url("accounts/login/") 38 r=requests.post(url,data=data_json) 39 result=r.json() 40 log.info(u"获取code值:%s"%result["code"]) 41 self.assertEqual(result["code"],200) 42 log.info(u"message内容:%s"%result["message"]) 43 self.assertEqual(result["message"],"Login Successful") 44 45 46 if __name__ == "__main__": 47 unittest.main()