专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 软件测试

Logging模块学习记要

发布时间:2011-06-20 19:10:53 文章来源:www.iduyao.cn 采编人员:星星草
Logging模块学习记录

一:logging 和 print 有什么不同呢。它有以下的优势:

你可以控制消息的级别,过滤掉那些并不重要的消息。 
你可决定输出到什么地方,以及怎么输出。 
有许多的重要性别级可供选择,debug、info、warning、error 以及 critical。通过赋予 logger 或者 handler 不同的级别,你就可以只输出错误消息到特定的记录文件中,或者在调试时只记录调试信息



默认情况下logging模块将大致打印到屏幕上,日志级别为 等于或高于WARNING 级别的日志信息才会输出。
日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
默认级别:

 

二:要整明白的几个概念:
Logger 记录器: 暴露了应用程序代码能直接使用接口
Handler 处理器: 将(记录器产生)日志记录发送至合适的目的地
Filter 过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录
Formatter 格式化器:指明了最终输出中日志记录的布局。
简单的理解:logging库提供了多个组建:Logger、Handler、Filter、Formater。 Logger对象提供应用程序可直接使用的接口,Handler发送日志到合适的指定的目的地,Filter提供了过滤日志信息的方法,Formatter 指定日志显示的格式
 
以上几个概念分别具体能做什么?
Logger记录器是一个属性层级结构,在使用接口debug
,inof,warn,error,critical 之前必须创建logger实例,也就是记录器,如果没有显示的创建 ,则会默认创建一个rootlogger,并用用默认的日志级别(WARN),处理器Handler(StreamHandler,即将日志信息打印输出在标准输出上),和格式化器Formatter(默认的格式即为第一个简单使用程序中输出的格式)。
 
实例:logger=logging.getLogger(logger_name)
 
接着Logger实例可以对日志级别进行设置:(大于等于这个级别的日志才会被输出)
logger.setLevel(logging.WARNING)
继续增加处理器Handler&删除:
logger.addHandler(handler_warn)
logger.removeHandler(handler_warn)
 
Handler 处理器常用三种:StreamHandler,FileHandler,NullHandler(以下实例中会用到)

 

实例步骤:

 1 import logging
 2 # 1.创建日志对象
 3 logger=logging.getLogger()
 4 
 5 loggera=logging.getLogger('myselflogging')    #w
 6 loggera.setLevel(logging.DEBUG)
 7 
 8 loggerb=logging.getLogger('myselflogging')
 9 loggerb.setLevel(logging.INFO)
10 
11 loggerc=logging.getLogger('myselflogging.a')
12 loggerc.setLevel(logging.WARNING   )
13 
14 loggerd=logging.getLogger('myselflogging.a.a')
15 loggerd.setLevel(logging.ERROR)
16 
17 loggere=logging.getLogger('myselflogging.a.a.a')
18 loggere.setLevel(logging.CRITICAL)
19 
20 # 2.1创建一个Handler 用来写入日志文件
21 fobj=logging.FileHandler('./FileHandler.log')
22 # 2.2创建一个Handler 用来在控制台显示
23 sobj=logging.StreamHandler()
24 # 3.定义Handler输出的格式
25 foramtter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
26 fobj.setFormatter(foramtter)
27 sobj.setFormatter(foramtter)
28 # 4.添加日志消息处理器
29 logger.addHandler(fobj)
30 logger.addHandler(sobj)
31 
32 #日志输出
33 print('未显示设定日志等级,默认为Warning')
34 logger.debug('logger debug message')
35 logger.info('logger info message')
36 logger.warning('logger warning message')
37 logger.error('logger error message')
38 logger.critical('logger critical message')
39 
40 print('loggera=myselflogging,显示设定等级是:logging.DEBUG')
41 loggera.debug('loggera debug message')
42 loggera.info('loggera info message')
43 loggera.warning('loggera warning message')
44 loggera.error('loggera error message')
45 loggera.critical('loggera critical message')
46 
47 print('loggerb=myselflogging,显示设定等级是:logging.INFO')
48 loggerb.debug('loggerb debug message')
49 loggerb.info('loggerb info message')
50 loggerb.warning('loggerb warning message')
51 loggerb.error('loggerb error message')
52 loggerb.critical('loggerb critical message')
53 
54 print('loggerc=myselflogging,显示设定等级是:logging.WARNING')
55 loggerc.debug('loggerc debug message')
56 loggerc.info('loggerc info message')
57 loggerc.warning('loggerc warning message')
58 loggerc.error('loggerc error message')
59 loggerc.critical('loggerc critical message')
60 
61 print('loggerd=myselflogging,显示设定等级是:logging.ERROR')
62 loggerd.debug('loggerd debug message')
63 loggerd.info('loggerd info message')
64 loggerd.warning('loggerd warning message')
65 loggerd.error('loggerd error message')
66 loggerd.critical('loggerd critical message')
67 
68 print('loggere=myselflogging,显示设定等级是:logging.CRITICAL')
69 loggere.debug('loggere debug message')
70 loggere.info('loggere info message')
71 loggere.warning('loggere warning message')
72 loggere.error('loggere error message')
73 loggere.critical('loggere critical message')

 

输出:

2017-07-28 00:20:59,698-root-WARNING-logger warning message
2017-07-28 00:20:59,698-root-ERROR-logger error message
2017-07-28 00:20:59,698-root-CRITICAL-logger critical message
2017-07-28 00:20:59,698-myselflogging-INFO-loggera info message
2017-07-28 00:20:59,698-myselflogging-WARNING-loggera warning message
2017-07-28 00:20:59,698-myselflogging-ERROR-loggera error message
2017-07-28 00:20:59,699-myselflogging-CRITICAL-loggera critical message
2017-07-28 00:20:59,699-myselflogging-INFO-loggerb info message
2017-07-28 00:20:59,699-myselflogging-WARNING-loggerb warning message
2017-07-28 00:20:59,699-myselflogging-ERROR-loggerb error message
2017-07-28 00:20:59,699-myselflogging-CRITICAL-loggerb critical message
2017-07-28 00:20:59,699-myselflogging.a-WARNING-loggerc warning message
2017-07-28 00:20:59,699-myselflogging.a-ERROR-loggerc error message
2017-07-28 00:20:59,699-myselflogging.a-CRITICAL-loggerc critical message
2017-07-28 00:20:59,700-myselflogging.a.a-ERROR-loggerd error message
2017-07-28 00:20:59,700-myselflogging.a.a-CRITICAL-loggerd critical message
2017-07-28 00:20:59,700-myselflogging.a.a.a-CRITICAL-loggere critical message


根据以上信息要清除以下几点:
1.未显示定义日志等级,默认日志级别WARNIING,所以结果只输出了大于等于WARNIING级别的信息。
2.日志名称一样,返回的其实是一个实例,loggera 和 loggerb 的记录器名称一样,使用这个技巧就可以跨模块调用同样的logger来记录日志。因为b设置的INFO级别,所以a按照b的设置显示,所以不显示debug级日志
未完待续



封装在自动化的运用:
 1 #! /usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # __author__ = "Q1mi"
 4 # Email: master@liwenzhou.com
 5 # Date: 2017/7/28
 6 
 7 import logging
 8 import  os
 9 import time
10 
11 flie_logpath='D:\\PY_HtmlReport\\logreport'
12 
13 class CreateLog():
14 
15     def __init__(self):
16 
17         #创建文件名称
18         self.logname = os.path.join(flie_logpath, '%s.log' % time.strftime('%Y_%m_%d'))
19         #创建记录器Logger
20         self.logger=logging.getLogger()
21         #设置LOGGER级别
22         self.logger.setLevel(logging.DEBUG)
23 
24         #设置日志输出格式
25         self.formatter=logging.Formatter('%(asctime)s-%(filename)s-%(levelname)s-%(message)s')
26 
27         #类的私有方法
28     def __printaddhandler(self,level,message):
29         #创建一个Handler 输出到本地
30         fh=logging.FileHandler(self.logname,'a',encoding='UTF-8')  #追加模式
31         #设置本地文件日志等级
32         fh.setLevel(logging.DEBUG)
33         #输出格式设置
34         fh.setFormatter(self.formatter)
35         #把logger添加到Handler
36         self.logger.addHandler(fh)
37         # 创建一个Handler到控制台
38         sh =logging.StreamHandler()
39         sh.setLevel(logging.DEBUG)
40         sh.setFormatter(self.formatter)
41         self.logger.addHandler(sh)
42         #逐步判断传入日志等级参数:
43         if level=='info':
44             self.logger.info(message)
45         elif level =='debug':
46             self.logger.debug(message)
47         elif level =='warning':
48             self.logger.warning(message)
49         elif level =='error':
50             self.logger.error(message)
51         elif level =='critical':
52             self.logger.critical(message)
53         #预留重复输出日志
54         self.logger.removeHandler(fh)
55         self.logger.removeHandler(sh)
56 
57         #关闭打开的日志文件
58         fh.close()
59 
60     def debug(self,message):
61         #在内部访问类的私有方法:
62         self.__printaddhandler('debug',message)
63 
64     def info(self,message):
65         #在内部访问类的私有方法:
66         self.__printaddhandler('info',message)
67 
68     def warning(self,message):
69         #在内部访问类的私有方法:
70         self.__printaddhandler('warning',message)
71 
72     def error(self,message):
73         #在内部访问类的私有方法:
74         self.__printaddhandler('error',message)
75 
76     def critical(self,message):
77         #在内部访问类的私有方法:
78         self.__printaddhandler('critical',message)
79 
80 if __name__ =='__main__':
81 
82     l=CreateLog()
83     # l.info('info')
84     # l.debug('debug')
85     l.warning('warning')
86     l.error('error')
87     l.critical('critical')

将封装好的类,灵活运用在自动化用例当中。

 
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: