日志模块
- 日志流程
- 控制台处理器
- 运行结果
- 文件处理器
- 封装日志模块
- 完整代码
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")
封装日志模块
- 第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("开始打印")