[接口测试 - 基础篇] 12 还是要掌握python日志管理模块的

python logging模块介绍

Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。

logging模块与log4j的机制是一样的,只是具体的实现细节不同。模块提供logger,handler,filter,formatter。

  • logger 提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。
  • handler 将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
  • filter 提供一种优雅的方式决定一个日志记录是否发送到handler。
  • formatter 指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。

与log4j类似,logger,handler和日志消息的调用可以有具体的日志级别(Level),只有在日志消息的级别大于logger和handler的级别。

封装一个自己的日志类

下面我们把其复杂的功能进行简化封装,只使用最基本的的功能,来自定义成我们自己的日志管理类,并演示如何使用。

#-*- coding:utf-8 -*-

__author__ = "苦叶子"

import logging

LOGGING_FORMAT = '%(asctime)s %(filename)s[line:%(lineno)d] \
    %(levelname)s %(message)s'


class LYMLogging:
    def __init__(self, 
        level=logging.DEBUG, # 日志级别
        format=LOGGING_FORMAT, # 日志格式
        datefmt='%a, %d %b %Y %H:%M:%S', # 日期格式
        filename='LYM.log', # 日志文件名
        filemode='w' # 文件打开模式
        ):
        self.level = level
        self.format = format
        self.datefmt = datefmt
        self.filename = filename
        self.filemode = filemode        

        # 初始化日志同时输出到console和日志文件
        logging.basicConfig(level=self.level, 
            format=self.format, 
            datefmt=self.datefmt,
            filename=self.filename,
            filemode=self.filemode)    

        # 定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,
        # 并将其添加到当前的日志处理对象
        console = logging.StreamHandler()
        console.setLevel(logging.INFO)
        formatter = logging.Formatter('%(name)-12s: %(levelname)-8s \
            %(message)s')
        console.setFormatter(formatter)
        logging.getLogger('LYMLogger').addHandler(console)
        self.log = logging.getLogger("LYMLogger")     
   
    # 日志输出
    def output(self, msg, level=logging.DEBUG):
        if level == logging.DEBUG:            
            # 调试信息
            self.log.debug(msg)        
        elif level == logging.INFO:            
            # 一般的信息
            self.log.info(msg)        
        elif level == logging.WARNING:            
            # 警告信息
            self.log.warning(msg)        
        elif level == logging.ERROR:            
            # 错误信息
            self.log.error(msg)        
        else:            
            # 尼玛
            self.log.critical(msg)            
            
    
    def set_level(self, level=logging.DEBUG):
        self.log.set_level(level)  
          if __name__ == "__main__":
    print("python logging实例")

    log = LYMLogging()

    log.output("it's debug msg", level=logging.DEBUG)
    log.output("it's info msg", level=logging.INFO)
    log.output("it's warning msg", level=logging.WARNING)
    log.output("it's error msg", level=logging.ERROR)
    log.output("it's fuck msg", level=logging.CRITICAL)

结果输出

在控制台输出一下内容

python logging实例 LYMLogger : INFO it's info msg LYMLogger : WARNING it's warning msg LYMLogger : ERROR it's error msg LYMLogger : CRITICAL it's fuck msg

在LYM.log日志文件中写入了以下内容:

Wed, 23 Aug 2017 10:04:05 logging_demo.py[line:43] DEBUG it's debug msg Wed, 23 Aug 2017 10:04:05 logging_demo.py[line:46] INFO it's info msg Wed, 23 Aug 2017 10:04:05 logging_demo.py[line:49] WARNING it's warning msg Wed, 23 Aug 2017 10:04:05 logging_demo.py[line:52] ERROR it's error msg Wed, 23 Aug 2017 10:04:05 logging_demo.py[line:55] CRITICAL it's fuck msg

请思考为什么控制台和日志文件的内容有区别?

小结

这里只是对日志模块logging进行了简单的分享,对于其更强大的功能请自行去学习和实践。例如:

  • 用配置文件来控制日志输出
  • 实现日志回滚

原文发布于微信公众号 - 开源优测(DeepTest)

原文发表时间:2017-08-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

JPA、Hibernate、Spring data jpa之间的关系,终于明白了

全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。

912
来自专栏不想当开发的产品不是好测试

通过代码去执行testNG用例

背景 用testNG去编写的测试用例,通过@Test去执行用例,一般本地都是通过IDE去执行相应的方法,持续集成的话,都是通过maven来执行或指定testNG...

3888
来自专栏Petrichor的专栏

论.idea文件夹是干嘛的

python为什么每次创建的文件目录下都含 .idea/文件夹?该文件夹又是用来干嘛的?

1.2K3
来自专栏闻道于事

JavaWeb(一)JSP原理,组成

JSP(Java sever pages):一种用于开发动态web页面(资源)的技术。 jsp页面是在服务器上运行的一个页面,一个jsp页面就是一个类。写jsp...

4808
来自专栏java学习

Jre和Jdk的区别?

Jre和Jdk的区别 JRE:(Java Runtime Environment),java运行环境。包括Java虚拟机(JVM Java Virtual Ma...

3429
来自专栏蓝天

GDB高级技巧

难得有雅兴,边动手边记录操作步骤,本文主要示例一些平常较少使用到的GDB功能,掌握这些用法有助于提高GDB调试和解决问题的能力。

801
来自专栏浪淘沙

使用Jsp编写网页并实现数据库的增删改查

首先jsp 和Servlet语句基本一样,这里的实现需要用到上篇http://blog.csdn.net/qq_32539825/article/details...

2.3K4
来自专栏流柯技术学院

python日志模块---logging

默认情况下,logging将日志打印到屏幕,日志级别为WARNING; 日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO ...

982
来自专栏aoho求索

Spring Cloud Gateway中的过滤器工厂:重试过滤器

Spring Cloud Gateway基于Spring Boot 2,是Spring Cloud的全新项目,该项目提供了一个构建在Spring 生态之上的AP...

1892
来自专栏cloudskyme

关于tuscany插件的安装

首先找到网站 http://www.apache.org/dist/tuscany/java/sca/ 看到版本列表,目前比较稳定的版本是1.6.2,所以进到1...

3046

扫码关注云+社区

领取腾讯云代金券