Python自动化框架必备模块:logging~你学会了吗?

logging模块

  • 你可以控制消息的级别,过滤掉那些并不重要的消息。
  • 你可决定输出到什么地方,以及怎么输出。有许多的重要性别级可供选择,debug、info、warning、error 以及 critical
  • 通过赋予 logger 或者 handler 不同的级别,你就可以只输出错误消息到特定的记录文件中,或者在调试时只记录调试信息。
日志级别
  • 级别从高到低
级别使用范围
CRITICAL严重错误,程序本身可能无法继续运行50
ERROR现更严重的问题,软件无法执行某些功能40
WARNING意想不到的事情发生了,或预示着某个问题。但软件仍按预期运行。30
INFO确认代码运行正常20
DEBUG详细信息,用于诊断问题10
# -*- coding: utf-8 -*-
# @Author : 码上开始

import logging

# 设置日志输出的等级,这样的话就能输出debug及以上的日志
# logging.basicConfig(level="DEBUG")

logging.debug("info信息")
logging.info("info信息")
logging.warning("warning信息")
logging.error("error")
logging.critical("critical")
运行结果
  • 默认打印WARNING及以上的日志信息
  • level=“DEBUG” 设置级别名必须都是大写
  • 如果我想打印日志的时间、在哪一行等格式?可以实现吗??
warning信息
error
critical
实现日志格式
  • 使用basicConfig中的参数format
# -*- coding: utf-8 -*-
# @Author : 码上开始

import logging

# 定制日志打印格式
fmt = "%(name)s-%(levelname)s %(asctime)s %(message)s"
logging.basicConfig(level="DEBUG", format=fmt)

logging.debug("debug信息")
logging.info("info信息")
logging.warning("warning信息")
logging.error("error")
logging.critical("critical")

运行结果

  • 默认名字显示的root(可否显示一个自定义名字?继续往下看)
root-DEBUG 2021-01-23 17:14:57,553 debug信息
root-INFO 2021-01-23 17:14:57,553 info信息
root-WARNING 2021-01-23 17:14:57,553 warning信息
root-ERROR 2021-01-23 17:14:57,553 error
root-CRITICAL 2021-01-23 17:14:57,553 critical

日志流程

第1步:创建日志器
  • 提供程序使用的接口,可以理解就创建一个logging实例化类
  • 默认日志级别为:WARNING
# -*- coding: utf-8 -*-
# @Author : 码上开始

import logging

# 创建日志器对像
log = logging.getLogger("码上开始")
第2步:创建处理器
  • 由处理器来处理日成生的位置(控制台或文件或两者同时存在)
  • 重点:日志器添加处理器
控制台处理器
# -*- coding: utf-8 -*-
# @Author : 码上开始

import logging

# 定义日志器
log = logging.getLogger()
# 可设置等级,默认级别为WARNING

# 控制台处理器
console_handle = logging.StreamHandler()
# 处理器级别
# console_handle.setLevel(level="INFO")
# 日志器添加处理器
log.addHandler(console_handle)

log.debug("debug信息")
log.info("info信息")
log.warning("warning信息")
log.error("error")
log.critical("critical")
运行结果
  • 如果日志器级别 >处理器级别则显示日志器级别,反之显示处理器级别
  • 默认级别为WARING,所以只打印这三条日志
log.debug("debug信息")
log.info("info信息")
log.warning("warning信息")
文件处理器
# -*- coding: utf-8 -*-
# @Author : 码上开始

import logging

# 定义日志器
log = logging.getLogger()

# 文件处理器
file_handle = logging.FileHandler("./log", mode="a", encoding="utf-8")

# 日志器添加处理器
log.addHandler(file_handle)

log.debug("debug信息")
log.info("info信息")
log.warning("warning信息")
log.error("error")
log.critical("critical")
第3步:格式器
  • 决定日志生成的最终输出格式
  • 重点:处理器添加格式器
# -*- coding: utf-8 -*-
# @Author : 码上开始

import logging

# 定义日志器
log = logging.getLogger("码上开始")

# 定义处理器
console_handle = logging.StreamHandler()

# 定义日志打印格式
fmt = "%(name)s--->%(levelname)s--->%(asctime)s--->%(message)s"
# 创建格式器
get_fmt= logging.Formatter(fmt=fmt)
# 处理器添加格式器
console_handle.setFormatter(get_fmt)

# 日志器添加处理器
log.addHandler(console_handle)

log.debug("debug信息")
log.info("info信息")
log.warning("warning信息")
log.error("error")
log.critical("critica")

运行结果:

码上开始--->WARNING--->2021-01-23 19:23:57,898--->warning信息
码上开始--->ERROR--->2021-01-23 19:23:57,899--->error
码上开始--->CRITICAL--->2021-01-23 19:23:57,899--->critical
日志同时生成在控制台和文本
  • 重点就是创建1个控制台/文本处理器
  • 小伙伴可能会发现,我们的代码没有进行封装,那最后一步,我们封装日志模块
# -*- coding: utf-8 -*-
# @Author : 码上开始

import logging

# 定义日志器
log = logging.getLogger("码上开始")

# 定义控制台和文本处理器
console_handle = logging.StreamHandler()
file_handle =  logging.FileHandler("./log.txt", mode="a", encoding="utf-8")

# 定义日志打印格式
fmt = "%(name)s--->%(levelname)s--->%(asctime)s--->%(message)s"

# 创建格式器
get_fmt= logging.Formatter(fmt=fmt)

# 处理器添加格式器
console_handle.setFormatter(get_fmt)
file_handle.setFormatter(get_fmt)

# 日志器添加处理器
log.addHandler(console_handle)
log.addHandler(file_handle)

log.debug("debug信息")
log.info("info信息")
log.warning("warning信息")
log.error("error")
log.critical("critical")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eNAaUV1i-1611410075945)(C:\Users\zhichao\AppData\Roaming\Typora\typora-user-images\image-20210123194517731.png)]

封装日志模块

  • 第1步:创建日志器
def __init__(self):
    # 日志器
    self.log = logging.getLogger("码上开始")
  • 第2步:创建处理器
def ConsoleHadle(self, level="WARNING"):
    """控制台处理器"""
	
    # 创建控制台处理器
    self.console_handler = logging.StreamHandler()
    # 设置处理器等级
    self.console_handler.setLevel(level)
    # 处理器添加格式器
    self.console_handler.setFormatter(self.getFormater()[0])
    # 返回控制台处理器
    return self.console_handler

def FileHandle(self, level="DEBUG"):
    """文件处理器"""
	
    # 创建文件处理器
    self.file_handler = logging.FileHandler("./log.txt", mode="a", encoding="utf-8")
    # 设置处理器等级
    self.file_handler.setLevel(level)
    # 处理器添加格式器
    self.file_handler.setFormatter(self.getFormater()[1])
    # 返回文件处理器
    return self.file_handler
  • 第3步:创建格式器
def getFormater(self):
    """格式器"""

    # 定义输出格式
    self.console_fmt = logging.Formatter(fmt="%(name)s--->%(levelname)s--->%(asctime)s--->%(message)s")
    self.file_fmt = logging.Formatter(fmt="%(levelname)s--->%(asctime)s--->%(message)s")
    # 返回格式器,第2个步骤中调用添加格式器
    return self.console_fmt, self.file_fmt
  • 第4步:日志器添加格式器
def get_log(self):
    # 日志添加控制台处理器
    self.log.addHandler(self.ConsoleHadle())
    # 日志添加文件处理器
    self.log.addHandler(self.FileHandle())
    return self.log
完整代码
# -*- coding: utf-8 -*-
# @Author: 一凡

import logging

class Log():

    def __init__(self, level="DEBUG"):
        # 日志器
        self.log = logging.getLogger("test")
        self.log.setLevel(level)

    def console_handle(self, level="DEBUG"):
        """控制台处理器"""

        self.console_handler = logging.StreamHandler()
        self.console_handler.setLevel(level)
        # 处理器添加格式器
        self.console_handler.setFormatter(self.get_formatter()[0])
        return self.console_handler

    def file_handle(self, level="DEBUG"):
        """文件处理器"""

        self.file_handler = logging.FileHandler("./log.txt", mode="a", encoding="utf-8")
        self.file_handler.setLevel(level)
        # 处理器添加格式器
        self.file_handler.setFormatter(self.get_formatter()[1])
        return self.file_handler

    def get_formatter(self):
        """格式器"""

        # 定义输出格式
        self.console_fmt = logging.Formatter(fmt="%(name)s--->%(levelname)s--->%(asctime)s--->%(message)s")
        self.file_fmt = logging.Formatter(fmt="%(levelname)s--->%(asctime)s--->%(message)s")
        return self.console_fmt, self.file_fmt

    def get_log(self):
        # 日志器添加控制台处理器
        self.log.addHandler(self.console_handle())
        # 日志器添加文件处理器
        self.log.addHandler(self.file_handle())
        return self.log


#实列化类
log = Log()
a = log.get_log()
a.debug("开始打印")

如果对软件测试、接口测试、自动化测试、持续集成、面试经验。感兴趣可以进到893694563,群内会有不定期的分享测试资料。还会有技术大牛,业内同行一起交流技术

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上开始

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值