| 说明 | |
|---|---|
| DEBUG | 输出详细的运行情况,主要用于调试。 |
| INFO | 确认一切按预期运行,一般用于输出重要运行情况。 |
| WARNING | 系统运行时出现未知的事情(如:警告内存空间不足),但是软件还可以继续运行,可能以后运行时会出现问题。 |
| ERROR | 系统运行时发生了错误,但是还可以继续运行。 |
| CRITICAL | 一个严重的错误,表明程序本身可能无法继续运行。 |
这5个等级,也分别对应5种打印日志的方法:debug、info、warning、error、critical。默认的日志收集器是收集WARNING以上等级的日志。
import logging
#日志收集器
#默认的日志收集器是root,默认收集WARNING以上等级的日志。
logging.debug("这是debug等级的日志信息")
logging.info("这是info等级的日志信息")
logging.warning("这是warning等级的日志信息")
logging.error("这是error等级的日志信息")
logging.critical("这是critical等级的日志信息")

二、日志收集器
import logging
#创建自己的日志收集器
my_log = logging.getLogger("my_log")
#设置收集的日志等级,设置为DEBUG等级
my_log.setLevel("DEBUG")
#日志输出
my_log.debug("--my_log_debug--")
my_log.info("--my_log_info--")
my_log.warning("--my_log_warning--")
my_log.error("--my_log_error")

三、日志输出渠道
有两种方式记录跟踪,一种是输出到控制台,另一种是记录到文件中,如日志文件。
1.日志输出到控制台
#创建一个日志输出渠道,输出到控制台
l_s = logging.StreamHandler()
#设置输出的日志等级为INFO以上
l_s.setLevel("INFO")
#将日志输出渠道添加到日志收集器中
my_log.addHandler(l_s)
2.将日志输出到文件中
#创建一个日志输出渠道,输入到文件中
l_f = logging.FileHandler("login.log",encoding='utf8')
# 设置输出的日志等级为DEBUG以上
l_f.setLevel("DEBUG")
#将日志输出渠道添加到日志收集器中
my_log.addHandler(l_f)
3.将日志同时输出到控制台和文件中
import logging
# 创建自己的日志收集器
my_log = logging.getLogger("my_log")
# 设置收集的日志等级,设置为DEBUG等级
my_log.setLevel("DEBUG")
# 日志输出渠道
# 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为INFO以上
l_s = logging.StreamHandler()
l_s.setLevel("INFO")
# 创构建一个日志输出渠道(输出到文件),并且设置输出的日志等级为DEBUG以上
l_f = logging.FileHandler("login.log",encoding='utf8')
l_f.setLevel("DEBUG")
#将日志输出渠道添加到日志收集器中
my_log.addHandler(l_s)
my_log.addHandler(l_f)
#日志输出
my_log.debug("--my_log_debug--")
my_log.info("--my_log_info--")
my_log.warning("--my_log_warning--")
my_log.error("--my_log_error")
my_log.error("--my_log_critical")
控制台输出结果为:

日志文件的输出结果为:

四、日志输出格式
可以通过logging.Formatter指定日志的输出格式,这个参数可以输出很多有用的信息,如下:
- %(name)s:收集器名称
- %(levelno)s:打印日志级别的数值
- %(levelname)s:打印日志级别名称
- %(pathname)s:打印当前执行程序的路径,其实就是sys.argv()
- %(filename)s:打印当前执行程序名
- %(funcName)s:打印日志的当前函数
- %(lineno)d:打印日志的当前行号
- %(asctime)s:打印日志的时间
- %(thread)d:打印线程ID %(threadName)s:打印线程名称
- %(process)d:打印进程ID
- %(message)s:打印日志信息
工作中常用格式如下:
ft = "%(asctime)s - [%(filename)s -->line:%(lineno)d] - %(levelname)s: %(message)s"
这个格式可以输出日志的打印时间,是哪个模块的哪一行输出的,输出的日志级别是什么,以及输出的日志内容。
import logging
# 创建自己的日志收集器
my_log = logging.getLogger("my_log")
# 设置收集的日志等级,设置为DEBUG等级
my_log.setLevel("DEBUG")
# 日志输出渠道
# 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为INFO以上
l_s = logging.StreamHandler()
l_s.setLevel("INFO")
# 创构建一个日志输出渠道(输出到文件),并且设置输出的日志等级为DEBUG以上
l_f = logging.FileHandler("login.log",encoding='utf8')
l_f.setLevel("DEBUG")
#将日志输出渠道添加到日志收集器中
my_log.addHandler(l_s)
my_log.addHandler(l_f)
# 设置日志输出的格式
ft = "%(asctime)s - [%(filename)s -->line:%(lineno)d] - %(levelname)s: %(message)s"
ft = logging.Formatter(ft)
# 设置控制台和日志文件输出日志的格式
l_s.setFormatter(ft)
l_f.setFormatter(ft)
#日志输出
my_log.debug("--my_log_debug--")
my_log.info("--my_log_info--")
my_log.warning("--my_log_warning--")
my_log.error("--my_log_error")
my_log.error("--my_log_critical")
控制台输出结果为:

日志文件的输出结果为:

封装一个日志的类(在接口测试时可直接使用)
第一种方法:__init__
import logging
class MyLogging(object):
def __init__(self):
# 创建自己的日志收集器
self.my_log = logging.getLogger("my_log")
# 设置收集的日志等级,设置为DEBUG等级
self.my_log.setLevel("DEBUG")
# 日志输出渠道
# 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为INFO以上
l_s = logging.StreamHandler()
l_s.setLevel("INFO")
# 创构建一个日志输出渠道(输出到文件),并且设置输出的日志等级为DEBUG以上
l_f = logging.FileHandler("login.log",encoding='utf8')
l_f.setLevel("DEBUG")
#将日志输出渠道添加到日志收集器中
self.my_log.addHandler(l_s)
self.my_log.addHandler(l_f)
# 设置日志输出的格式
ft = "%(asctime)s - [%(filename)s -->line:%(lineno)d] - %(levelname)s: %(message)s"
ft = logging.Formatter(ft)
# 设置控制台和日志文件输出日志的格式
l_s.setFormatter(ft)
l_f.setFormatter(ft)
def debug(self,msg):
self.my_log.debug(msg)
def info(self,msg):
self.my_log.info(msg)
def warning(self,msg):
self.my_log.warning(msg)
def error(self,msg):
self.my_log.error(msg)
def critical(self,msg):
self.my_log.critical(msg)
#日志输出
m_log = MyLogging()
m_log.debug("--my_log_debug--")
m_log.info("--my_log_info--")
m_log.warning("--my_log_warning--")
m_log.error("--my_log_error")
m_log.critical("--my_log_critical")
输出结果为:

第二种方法:普通
import logging
class MyLogging(object):
def create_logger(*args,**kwargs):
# 创建自己的日志收集器
my_log = logging.getLogger("my_log")
# 设置收集的日志等级,设置为DEBUG等级
my_log.setLevel("DEBUG")
# 日志输出渠道
# 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为INFO以上
l_s = logging.StreamHandler()
l_s.setLevel("INFO")
# 创构建一个日志输出渠道(输出到文件),并且设置输出的日志等级为DEBUG以上
l_f = logging.FileHandler("login.log",encoding='utf8')
l_f.setLevel("DEBUG")
#将日志输出渠道添加到日志收集器中
my_log.addHandler(l_s)
my_log.addHandler(l_f)
# 设置日志输出的格式
ft = "%(asctime)s - [%(filename)s -->line:%(lineno)d] - %(levelname)s: %(message)s"
ft = logging.Formatter(ft)
# 设置控制台和日志文件输出日志的格式
l_s.setFormatter(ft)
l_f.setFormatter(ft)
return my_log
def debug(self,msg):
self.my_log.debug(msg)
def info(self,msg):
self.my_log.info(msg)
def warning(self,msg):
self.my_log.warning(msg)
def error(self,msg):
self.my_log.error(msg)
def critical(self,msg):
self.my_log.critical(msg)
#日志输出
m_log = MyLogging()
logger = m_log.create_logger()
logger.debug("--my_log_debug--")
logger.info("--my_log_info--")
logger.warning("--my_log_warning--")
logger.error("--my_log_error")
logger.critical("--my_log_critical")
输出结果为:

第三种方法:直接使用__new__
import logging
class MyLogging(object):
def __new__(cls,*args,**kwargs):
# 创建自己的日志收集器
my_log = logging.getLogger("my_log")
# 设置收集的日志等级,设置为DEBUG等级
my_log.setLevel("DEBUG")
# 日志输出渠道
# 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为INFO以上
l_s = logging.StreamHandler()
l_s.setLevel("INFO")
# 创构建一个日志输出渠道(输出到文件),并且设置输出的日志等级为DEBUG以上
l_f = logging.FileHandler("login.log",encoding='utf8')
l_f.setLevel("DEBUG")
#将日志输出渠道添加到日志收集器中
my_log.addHandler(l_s)
my_log.addHandler(l_f)
# 设置日志输出的格式
ft = "%(asctime)s - [%(filename)s -->line:%(lineno)d] - %(levelname)s: %(message)s"
ft = logging.Formatter(ft)
# 设置控制台和日志文件输出日志的格式
l_s.setFormatter(ft)
l_f.setFormatter(ft)
return my_log
def debug(self,msg):
my_log.debug(msg)
def info(self,msg):
my_log.info(msg)
def warning(self,msg):
my_log.warning(msg)
def error(self,msg):
my_log.error(msg)
def critical(self,msg):
my_log.critical(msg)
#日志输出
m_log = MyLogging()
m_log.debug("--my_log_debug--")
m_log.info("--my_log_info--")
m_log.warning("--my_log_warning--")
m_log.error("--my_log_error")
m_log.critical("--my_log_critical")
输出结果为:

扩展:设置日志名称、最大字节数、最多能存在的文件数,日志格式
import logging
from logging.handlers import RotatingFileHandler
# 创建自己的日志收集器
logger = logging.getLogger("my_log")
# 设置收集的日志等级,设置为DEBUG等级
logger.setLevel("DEBUG")
# 设置日志名称为test.log,日志最大字节数为1024,最多只能存在3个文件,设置日志格式为utf8
rf = RotatingFileHandler(filename="test.log",
maxBytes=1024,
backupCount=3,
encoding="utf8")
# 将日志输出渠道添加到日志收集器中
logger.addHandler(rf)
for i in range(200):
logger.debug("--my_log_debug--")
logger.info("--my_log_info--")
logger.warning("--my_log_warning--")
logger.error("--my_log_error")
logger.critical("--my_log_critical")