【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()

 

posted @ 2018-05-14 23:48  dhs94  阅读(163)  评论(0编辑  收藏  举报