码迷,mamicode.com
首页 > 其他好文 > 详细

Logging模块

时间:2018-05-15 01:54:24      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:unit   接口   lin   rom   语句   Matter   add   sock   mat   

 

1.日志记录级别

logging.debug<logging.info<logging.warning<logging.error<logging.critical

关键是最高级别,Info是最低级别,即如果我们配置了“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          # 日志输出格式
12         self.logger.setLevel(logging.DEBUG)
13         # 日志输出格式
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()

 

Logging模块

标签:unit   接口   lin   rom   语句   Matter   add   sock   mat   

原文地址:https://www.cnblogs.com/dhs94/p/9011431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!