目录
2.traceback.format_exc()在日志的用法
一、日志的基本应用
1.log日志的直接创建和使用
在python运行过程中,我们经常使用print来作为输出的方式。包括在调试和查看代码运行情况的时候。在自动化运行时我们也不可能一直盯着电脑屏幕来看整体的运行。就需要有一个模块来专门记录整个运行过程,如果出现问题则直接记录下来。于是乎就有了日志的模块logging库。
logging库本身是Python自带的官方库之一。所以不需要下载直接调用就可以了。
'''
Logging库的基本使用:
1. 创建日志对象,进行设置,日志等级是需要根据实际情况自行设置的。
2. 调用日志模块来实现日志的输出
3. 选择将日志信息保存在文件之中
'''
# 导入logging库
import logging
from class09.logging_config import getLogger
# logging库的创建:设置日志的相关内容
logging.basicConfig(
level=logging.DEBUG, # 设置日志的输出默认等级,不设置的情况下,默认为warning等级
# 设置日志的格式信息:asctime表示当前时间,levelname表示日志等级,filename表示运行的py文件名称,lineno表示行数,message表示输出信息
format='%(asctime)s %(levelname)s %(filename)s %(lineno)s:%(message)s',
filename='./logfile/log.log', # 设置日志写入文件的保存文件名称及路径,加入此设置则会在运行时生成一个日志文件
# 日志文件的内容写入,默认是以追加的方式来进行写入,也可以通过修改设置来改变写入的模式,一般不改
# filemode='w'
)
# 日志输出不同等级的内容:debug < info < warning < error < critical
logging.debug('这是debug的内容')
logging.info('这是info的内容')
logging.warning('这是warning的内容')
logging.error('这是erro的内容')
logging.critical('这是critical的内容')
输出效果如下:
log.log日志文件的显示如下所示:
2.traceback.format_exc()在日志的用法
import logging
import traceback
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(message)s %(filename)s %(lineno)s %(levelname)s',
filemode='a',
filename='./file/log.log'
)
logging.debug('这是debug的内容')
logging.info('这是info的内容')
logging.warning('这是warning的内容')
try:
1/0
except:
# traceback.format_exc()实现将异常信息写入日志文件中。便于出错后的调试。
# format_exc是生成异常信息的字符串内容。可以print也可以写入文件。
logging.error(traceback.format_exc())
logging.critical('这是critical的内容')
在日志中的显示效果如下图所示:
二、日志的进阶使用
logging的运行都是基于4个组件来实现的。除去通过基本的调用以外,也可以直接调用组件来实现日志的记录
1. logger:记录器,提供基本的能够被程序直接调用的接口
2. handler:处理器,提供将记录器的内容发送到目的地的作用
3. filter:过滤器,提供更好的粒度控制。
4. formatter:格式化器,设置日志的所有内容的格式
1.设置日志控制台输出
设置方法如下:
import logging
# 通过logger创建一个记录器
logger = logging.getLogger('zhp')
# 设置日志记录器的等级
logger.setLevel(logging.DEBUG)
# 设置记录器的格式
logger_format = logging.Formatter('%(levelname)s %(asctime)s %(filename)s %(lineno)s:%(message)s')
# 选择将日志输出到哪里去:控制台输出
stream_handler = logging.StreamHandler()
# 将handler添加到记录器中
logger.addHandler(stream_handler)
# 日志的输出
logger.info('这是logger的info信息')
logger.error('这是logger的erro信息')
输出效果如下:
logger的格式不会生效,在哪里输出就需要通过对应位置的handler的格式设置才能生效。logger的等级设置也一样。所以需要将定义的记录器的格式赋值给到控制台,代码如下:
stream_handler.setFormatter(logger_format)
效果如下所示:
2.设置日志文件中输出
import logging
# 通过logger创建一个记录器
logger = logging.getLogger('hzp')
# 设置日志记录器的等级
logger.setLevel(logging.DEBUG)
# 设置记录器的格式
logger_format = logging.Formatter('%(levelname)s %(asctime)s %(filename)s %(lineno)s: %(message)s')
# 选择将日志输出到哪里去:控制台输出
stream_handler = logging.StreamHandler()
# 控制台输出的等级
stream_handler.setLevel(logging.INFO)
# 控制台的格式
stream_handler.setFormatter(logger_format)
# 将日志在文件中输出
file_handler = logging.FileHandler(filename='./file/log1.log')
# 文件输出等级
file_handler.setLevel(logging.DEBUG)
# 设置文件输出的格式
file_handler.setFormatter(logger_format)
# 将handler添加到记录器中
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
# 日志的输出
logger.debug('这是logger的debug信息')
logger.info('这是logger的info信息')
logger.error('这是logger的error信息')
自动生成了log1.log日志文件,控制台输出的效果如下:
文件之中的效果如下:
三、配置文件设置与读取
配置项是固定不需要修改的。
获取配置项通过logging.config.fileConfig(配置文件)的方式获取。
配置文件的内容一定记得不要写错,不然会出现问题,其次不要写入中文相关内容,容易因为编码格式造成报错。
配置项文件,是log_conf.ini这样的格式,具体内容不需要大家去记,直接抄就行了,需要用的时候,直接复制过去调用即可,配置项文件如下:
[loggers]
keys = root
[handlers]
keys = fileHandler,streamHandler
[formatters]
keys = simpleFormatter
[logger_root]
level = DEBUG
handlers = fileHandler,streamHandler
[handler_fileHandler]
class = FileHandler
level = DEBUG
formatter = simpleFormatter
args = ('log_conf.log','a','utf-8')
[handler_streamHandler]
class = StreamHandler
level = DEBUG
formatter = simpleFormatter
[formatter_simpleFormatter]
format = %(levelname)s %(asctime)s %(filename)s %(module)s %(funcName)s %(lineno)s:%(message)s
读取ini配置项,实现logging的配置与输出,要读取ini实现日志库的配置,
则需要调用logging.config模块
# 导入logging.config
import logging.config
# 将日志记录器封装为函数,如果需要,则直接调用,生成logger来进行日志的记录
def getLogger():
# 读取配置文件
logging.config.fileConfig('log_conf.ini')
# 获取记录器
logger = logging.getLogger()
return logger
# 实例化记录器对象
logger = getLogger()
# 日志的输出
logger.debug('这是debug信息')
logger.info('这是info信息')
logger.warning('这是warning信息')
logger.error('这是error信息')