很多小伙伴平时写代码的时候,大部分情况利用print()函数来进行一些日志的打印,但是当把代码迁移到测试环境或者生成环境的时候,很难去定位BUG,而在python中,logging就可用来记录一些日志信息,便于我们维护和定位bug..
日志的重要性:
1.健全自己的代码,便于问题定位和分析
2.进行程序(代码)的调试
3.收集程序运行的情况
接下我们开始步入正题:
一、logging日志等级
![](https://img.haomeiwen.com/i13340093/0a9235404ee639c8.png)
import logging
# 设置打印日志的级别,level级别以上的日志会打印出
# level=logging.DEBUG 、INFO 、WARNING、ERROR、CRITICAL
def log_testing():
# 此处进行Logging.basicConfig() 设置,后面设置无效
logging.basicConfig(level=logging.ERROR)
logging.debug('debug,用来打印一些调试信息,级别最低')
logging.info('info,用来打印一些正常的操作信息')
logging.warning('waring,用来用来打印警告信息')
logging.error('error,一般用来打印一些错误信息')
logging.critical('critical,用来打印一些致命的错误信息,等级最高')
log_testing()
上面的日志目前只会打印在控制台上,业务一般需要保存在文档中,这个时候就需要我们自己去配置相关信息:
二、Logging.basicConfig()
logging.basicConfig()的参数除了日志等级的这个参数可以设置以外,还可以设置其他的参数,比如:
![](https://img.haomeiwen.com/i13340093/25cda4441a0bc5cf.png)
import logging
# 设置打印日志的级别,level级别以上的日志会打印出
# level=logging.DEBUG 、INFO 、WARNING、ERROR、CRITICAL
def log_testing():
# 此处进行Logging.basicConfig() 设置,后面设置无效
logging.basicConfig(filename='log.txt',
format ='%(asctime)s - %(name)s - %(levelname)s - %(message)s-%(funcName)s',
level=logging.ERROR)
logging.debug('debug,用来打印一些调试信息,级别最低')
logging.info('info,用来打印一些正常的操作信息')
logging.warning('waring,用来用来打印警告信息')
logging.error('error,一般用来打印一些错误信息')
logging.critical('critical,用来打印一些致命的错误信息,等级最高')
log_testing()
上述代码产生的日志文件截图如下:
![](https://img.haomeiwen.com/i13340093/70d0971fd447236d.png)
三、Logging组件
Logging中除了以上的一些设置之外,logging还提供了几个组件(类)供我们实现一些特殊的功能,它们主要是:
![](https://img.haomeiwen.com/i13340093/d30ab8282be53b21.jpg)
这些组件共同完成日志的配置和输出:
Logger需要通过handler将日志信息输出到目标位置,目标位置可以是sys.stdout和文件等。
不同的Handler可以将日志输出到不同的位置(不同的日志文件)。
Logger可以设置多个handler将同一条日志记录输出到不同的位置。
每个Handler都可以设置自己的filter从而实现日志过滤,保留实际项目中需要的日志。
formatter实现同一条日志以不同的格式输出到不同的地方。
简单的说就是:日志器作为入口,通过设置处理器的方式将日志输出,处理器再通过过滤器和格式器对日志进行相应的处理操作。
我们来简单的介绍一下这些组件中一些常用的方法:
1.Logger类
![](https://img.haomeiwen.com/i13340093/a4db4f4e8ad64ad6.jpg)
2.Handler类
![](https://img.haomeiwen.com/i13340093/b5d7322779338a9e.jpg)
3.Fliter类
看名字大家就知道这是一个过滤类,那么过滤什么呢?
Filter可以被Handler和Logger用来做比之前设置的日志等级level更为细粒度的、更复杂的相关过滤功能。
简单的说Filter是一个过滤器基类,它只允许某个logger层级下的日志事件通过过滤,保存下来。该类定义如下:
classlogging.Filter(name='')filter(record)
过滤举例:
例如用 ‘A.B’ 初始化的 Filter,那么其允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’ 等日志记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不满足过滤的条件。
如果用空字符串来对Filter初始化,所有日志记录的事件都将不会被过滤。
4.Formater类
Formater类主要负责日志的格式化输出的。
可通过logging.basicConfig或logging.Formatter函数来配置日志输出内容。
如:formatter = logging.Formatter(fmt=None, datefmt=None)。
如果不指明 fmt,将默认使用 '%(message)s' ,如果不指明 datefmt,将默认使用 ISO8601 日期格式。
说了这么多,我们先看两个简单的例子:
# 例1
import logging
from logging.handlersimport RotatingFileHandler
def logging_fun():
# 创建日志的记录等级设
logging.basicConfig(level=logging.DEBUG)
# 创建日志记录器,指明日志保存的路径,每个日志文件的最大值,保存的日志文件个数上限
log_handle = RotatingFileHandler("log.txt",maxBytes=1024 *1024,backupCount=5)
# 创建日志记录的格式
formatter = logging.Formatter("format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s-%(funcName)s',")
# 为创建的日志记录器设置日志记录格式
log_handle.setFormatter(formatter)
# 为全局的日志工具对象添加日志记录器
logging.getLogger().addHandler(log_handle)
logging.warning('用来用来打印警告信息')
logging.error('一般用来打印一些错误信息')
logging.critical('用来打印一些致命的错误信息,等级最高')
logging_fun()
四 :自定义logger日志输出文件
以上介绍的知识点,大家在平时或在实际的项目中使用基本上就足够了,下面我们简单的介绍一下怎么进行自定义logger进行日志的输出。
我们写一个sel_def_logger.py文件,文件中的定义一个类,内容如下:
import os
import sys
import logging
from timeimport strftime
# 输出日志路径
PATH = os.path.abspath('.') +'/logs/'
# 设置日志格式#和时间格式
FMT ='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s: %(message)s'
DATEFMT ='%Y-%m-%d %H:%M:%S'
class MyLog(object):
def __init__(self):
self.logger = logging.getLogger()
self.formatter = logging.Formatter(fmt=FMT,datefmt=DATEFMT)
self.log_filename ='{0}{1}.log'.format(PATH, strftime("%Y-%m-%d"))
self.logger.addHandler(self.get_file_handler(self.log_filename))
self.logger.addHandler(self.get_console_handler())
# 设置日志的默认级别
self.logger.setLevel(logging.DEBUG)
# 输出到文件handler的函数定义
def get_file_handler(self, filename):
filehandler = logging.FileHandler(filename,encoding="utf-8")
filehandler.setFormatter(self.formatter)
return filehandler
# 输出到控制台handler的函数定义
def get_console_handler(self):
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(self.formatter)
return console_handler
那么使用这个类的方法可以这样写:
import os
import sys
import logging
from timeimport strftime
# 输出日志路径
PATH = os.path.abspath('.') +'/logs/'
# 设置日志格式#和时间格式
FMT ='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s: %(message)s'
DATEFMT ='%Y-%m-%d %H:%M:%S'
import datetime
from sef_def_loggerimport MyLog
my_logg = MyLog().logger
my_logg.info("代码开始运行的时间{}".format(datetime.datetime.now()))
my_logg.debug('看看debug')
my_logg.error('This is a error')
生成的结果在我们预先生成的文件夹logs下,有类似的时间命名的日志文件如:2020-07-05.log,日志内容如下:
![](https://img.haomeiwen.com/i13340093/f5ef4150ff4eefa0.png)
网友评论