Logging模块学习记录

来源:互联网 发布:淘宝永久封店 身份证 编辑:程序博客网 时间:2024/05/21 01:53

一: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 time10 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         #创建记录器Logger20         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添加到Handler36         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')

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

 
原创粉丝点击