python自动化测试学习笔记-9python的日志模块

参考

 

logging模块,用来处理python中的日志;

import logging

logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')

执行查看结果:

可见,默认情况下python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET),默认的日志格式为日志级别:Logger名称:用户输出消息。

import logging

logging.basicConfig(level=logging.DEBUG,filename='2018log.log',filemode='a',format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
logging.debug('我的debug信息')
logging.info('我的info信息')
logging.warning('我的warning信息')
logging.error('我的error信息')
logging.critical('我的critical信息')

执行查看结果:生成了2018log.log文件

logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。


import logging
import sys

logging.basicConfig(level=logging.DEBUG,stream=sys.stderr,filemode='a',format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
logging.debug('我的debug信息')
logging.info('我的info信息')
logging.warning('我的warning信息')
logging.error('我的error信息')
logging.critical('我的critical信息')

执行查看结果:

logging库提供了多个组件:Logger、Handler、Filter、Formatter。

  • Loggers 暴露了应用程序代码可以直接使用的接口
  • Handlers 发送日志记录(由 loggers 创建)到合适的目的地
  • Filters 提供了细粒度的方法来决定哪些日志记录需要被输出
  • Formatters 指定了在最终输出时,日志记录的布局格式

 

Logger
Logger是一个树形层级结构,输出信息之前都要获得一个Logger(如果没有显示的获取则自动创建并使用root Logger,如第一个例子所示)。
logger = logging.getLogger()返回一个默认的Logger也即root Logger,并应用默认的日志级别、Handler和Formatter设置。
当然也可以通过Logger.setLevel(lel)指定最低的日志级别,可用的日志级别有logging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、logging.CRITICAL。
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()输出不同级别的日志,只有日志等级大于或等于设置的日志级别的日志才会被输出。

定义:logger = logging.getLogger(__name__)

Handler

Handler对象负责发送相关的信息到指定目的地,有几个常用的Handler方法:
Handler.setLevel(lel):指定日志级别,低于lel级别的日志将被忽略
Handler.setFormatter():给这个handler选择一个Formatter
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象

可以通过addHandler()方法为Logger添加多个Handler:

 

有多种可用的Handler:

logging.StreamHandler 可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息
logging.FileHandler 用于向一个文件输出日志信息
logging.handlers.RotatingFileHandler 类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出
logging.handlers.TimedRotatingFileHandler 和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件
logging.handlers.SocketHandler 使用TCP协议,将日志信息发送到网络。
logging.handlers.DatagramHandler 使用UDP协议,将日志信息发送到网络。
logging.handlers.SysLogHandler 日志输出到syslog
logging.handlers.NTEventLogHandler 远程输出日志到Windows NT/2000/XP的事件日志 
logging.handlers.SMTPHandler 远程输出日志到邮件地址
logging.handlers.MemoryHandler 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler 通过"GET"或"POST"远程输出到HTTP服务器
各个Handler的具体用法可查看参考书册:
https://docs.python.org/2/library/logging.handlers.html#module-logging.handlers

Formatter
Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。

Filter
限制只有满足过滤规则的日志才会输出。
比如我们定义了filter = logging.Filter('a.b.c'),并将这个Filter添加到了一个Handler上,则使用该Handler的Logger中只有名字带a.b.c前缀的Logger才能输出其日志。

    1. filter = logging.Filter('a.b.c')  
    2. fh.addFilter(filter)
    3. logger.addFilter(filter)

多模块使用logging
logging模块保证在同一个python解释器内,多次调用logging.getLogger('log_name')都会返回同一个logger实例,即使是在多个模块的情况下。所以典型的多模块场景下使用logging的方式是在main模块中配置logging,这个配置会作用于多个的子模块,然后在其他模块中直接通过getLogger获取Logger对象即可。

示例:
import logging
from logging import handlers
#获取logger
logger=logging.getLogger('TestLog')
#设置logger级别
logger.setLevel(logging.INFO)
#设置logger格式
format_str=logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
#输出到控制台
st=logging.StreamHandler()
st.setFormatter(format_str)
#输出到文件
th=handlers.TimedRotatingFileHandler('Testlog.log',when='h',interval=2,encoding='utf-8')
th.setFormatter(format_str)
#添加到handler
logger.addHandler(st)
logger.addHandler(th)

logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

 

执行查看结果:

查看生成的日志文件:

posted @ 2018-03-22 15:34  yingfeipei  阅读(1699)  评论(0编辑  收藏  举报