日志模块


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")

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

封装日志模块

  • 第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,群内会有不定期的分享测试资料。还会有技术大牛,业内同行一起交流技术