1. 日志级别
级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG logging.critical() -->输出CRITICAL级别日志 logging.error() -->输入ERROR级别日志 logging.warning() -->输入WARNING级别日志 logging.info() -->输入INFO级别日志 logging.debug() -->输入DEBUG级别日志
# 案例:在控制台分别输出各个级别的日志
import logging
logging.critical('critical日志信息') # CRITICAL:root:critical日志信息 root是默认日志器的名字
logging.error('error日志信息') #ERROR:root:error日志信息
logging.warning('warning日志信息')
logging.info('info日志信息')
logging.debug('debug日志信息')
# print(a) #NameError: name 'a' is not defined
# CRITICAL:root:critical
# root是默认日志器的名字;默认的日志器默认日志级别:warning --筛选日志信息的显示
# 总结:默认只输入Warning级别及以上级别的日志,如果需要查看到所有的日志,则需要改变默认日志级别
# 改变默认日志器的日志级别
2. 设置日志格式
logging.basicConfig()函数可以设置日志级别,日志的格式以及日志的位置等。
# 案例:设置日志级别和日志格式,要求在控制台分别输出各个级别的日志,并将日志保存在本地文件
import logging
# 默认日志器的设置操作
# 1-输出位置的设置
logging.basicConfig(filename = 'test2.log',filemode='a')
# 存在一个问题,如果日志信息中有中文,则会显示乱码
# 可以用stream来进行解决
file = open('test3.log','a',encoding='utf-8')
logging.basicConfig(stream = file)
# 2-级别设置
#logging.basicConfig(level = logging.DEBUG)
# 3-格式设置
logging.basicConfig(format = '%(asctime)s ** %(levelname)s ** %(message)s -->%(filename)s:%(lineno)d')
logging.critical('critical日志信息') # CRITICAL:root:critical日志信息 root是默认日志器的名字
logging.error('error日志信息') #ERROR:root:error日志信息
logging.warning('warning日志信息')
logging.info('info日志信息')
logging.debug('debug日志信息')
# 日志级别对应的数字
# critical:50
# error:40
# warning:30
# info:20
# debug:10
3. 日志组件
日志的四大组件:日志器、处理器、过滤器、格式器 日志器:产生各级别日志的载体 处理器:日志显示在哪个位置(控制台、本地的文件中) 控制台处理器:将日志输出在控制台 文件处理器:将日志输出在文件中 过滤器:过滤/筛选日志 格式器:设置日志显示的内容以及自定义格式
3.1 控制台处理器
日志器+控制台处理器 创建日志器 logger=logging.getLogger() 日志器设置日志界别 创建控制台处理器 h=logging.StreamHandler() 处理器设置日志界别 日志器添加处理器 logger.addHandler(h) 输出日志
# 案例:自定义日志器和处理器,并在控制台输出所有的级别的日志信息
import logging
# 创建日志器
log = logging.getLogger('kate')
# 创建控制台处理器
s_handler = logging.StreamHandler()
# 日志器添加处理器
log.addHandler(s_handler)
# 输出日志
log.critical('critical日志信息') # CRITICAL:root:critical日志信息 root是默认日志器的名字
log.error('error日志信息') #ERROR:root:error日志信息
log.warning('warning日志信息')
log.info('info日志信息')
log.debug('debug日志信息')
总结:自定义的日志器默认的日志级别也是warning,所以只能输出警告及以上级别的日志信息
# 如何输出所有级别的日志信息
# 1:日志器可以设置日志级别
# 2:处理器也可以设置日志级别
#
import logging
# 创建日志器
log = logging.getLogger('kate')
# 日志器设置日志级别
# log.setLevel(level = logging.DEBUG)
# 创建控制台处理器
s_handler = logging.StreamHandler()
# 处理器设置日志级别
s_handler.setLevel(level = logging.DEBUG)
# 总结:当日志器和处理器同时设置了日志级别时,谁设置的日志级别高就用谁的设置
# 问题:当日志器没有设置级别,但是处理器设置为DEBUG级别之后,日志信息也只是显示warning及以上的日志信息?
# 日志器没有设置级别的时候,默认是warning ,warning>DEBUG,所以显示warning及以上的日志信息
# 日志器添加处理器
log.addHandler(s_handler)
# 输出日志
log.critical('critical日志信息') # CRITICAL:root:critical日志信息 root是默认日志器的名字
log.error('error日志信息') #ERROR:root:error日志信息
log.warning('warning日志信息')
log.info('info日志信息')
总结:当日志器和处理器同时都设置了日志级别,则谁的级别高就以谁为准
3.2 日志器+文件处理器
创建日志器 logger=logging.getLogger() 日志器设置日志级别:logger.setLevel(logging.DEBUG) 创建文件处理器 h=logging.FileHandler(filename, mode='a', encoding=None) 文件处理器设置日志级别:h..setLevel(logging.INFO) 日志器添加处理器 logger.addHandler(h) 日志输出
# 案例:自定义日志器和文件处理器,并在文件中保存所有的级别的日志信息
import logging
# 创建日志器
log = logging.getLogger('kate')
# 创建文件处理器
s_handler = logging.FileHandler(filename='demo1.log',encoding='utf-8')
# 日志器添加处理器
log.addHandler(s_handler)
# 输出日志
log.critical('critical日志信息') # CRITICAL:root:critical日志信息 root是默认日志器的名字
log.error('error日志信息') #ERROR:root:error日志信息
log.warning('warning日志信息')
log.info('info日志信息')
log.debug('debug日志信息')
总结:自定义的日志器默认的日志级别也是警告,所以只能输出警告及以上级别的日志信息 如何输出所有级别的日志信息 1:日志器可以设置日志级别 2:文件处理器也可以设置日志级别 总结:当日志器和处理器同时都设置了日志级别,则谁的级别高就以谁为准
3.3 格式处理器
创建日志器:logger=logging.getLogger() 日志器设置日志级别:logger.setLevel(logging.DEBUG) 创建处理器:s_hand=logging.StreamHandler() 处理器设置日志级别:s_hand.setLevel(logging.INFO) 创建格式器:format1=logging.Formatter(fmt="%(levelname)s === %(message)s") 日志器添加处理器:logger.addHandler(h) 处理器添加格式器:s_hand.setFormatter(format1) 日志输出
#案例:自定义日志器、处理器和格式器,分别在控制台和文件中记录日志信息,并且给日志信息设置不同的格式
import logging
# 创建日志器
log = logging.getLogger('kate')
# 创建控制台处理器
s_handler = logging.StreamHandler()
# 创建一个文件处理器
f_handler = logging.FileHandler(filename = 'demo2.log',encoding='utf-8')
# 日志器添加处理器
log.addHandler(s_handler)
log.addHandler(f_handler)
# 创建一个格式器
f1 = logging.Formatter(fmt= '%(asctime)s**%(levelname)s**%(filename)s:'
'%(lineno)d:%(message)s==%(name)s') # 日志器的名字:%(name)s
f2 = logging.Formatter(fmt= '%(asctime)s**%(levelname)s**%(message)s')
# 处理器设置格式器
s_handler.setFormatter(f2) #控制台处理器日志添加了指定的格式f2
f_handler.setFormatter(f1) # 文件处理器日志添加了指定的格式f1
# 输出日志
log.critical('critical日志信息') # CRITICAL:root:critical日志信息 root是默认日志器的名字
log.error('error日志信息') #ERROR:root:error日志信息
log.warning('warning日志信息')
log.info('info日志信息')
log.debug('debug日志信息')
如何将日志记录在控制台和文件中,并且两个日志保存的级别和格式都不相同 1-日志器设置日志级别 2-控制器设置日志级别 需求:控制台输出error以上的日志,文件中保存debug以上的日志信息 控制台输出error以上的日志: 日志设置日志级别:debug 控制台处理器设置日志级别:error 文件输出debug以上的日志: 日志设置日志级别:debug 文件处理器设置日志级别:debug
import logging
# 创建日志器
log = logging.getLogger('kate')
# 日志设置日志级别:DEBUG
log.setLevel(logging.DEBUG)
# 创建控制台处理器
s_handler = logging.StreamHandler()
# 控制台处理器设置日志级别:error
s_handler.setLevel(logging.ERROR)
# 创建一个文件处理器
f_handler = logging.FileHandler(filename = 'demo3.log',encoding='utf-8')
# 文件处理器设置日志级别:debug
f_handler.setLevel(logging.DEBUG)
# 日志器添加处理器
log.addHandler(s_handler)
log.addHandler(f_handler)
# 创建一个格式器
f1 = logging.Formatter(fmt= '%(asctime)s**%(levelname)s**%(filename)s:'
'%(lineno)d:%(message)s==%(name)s') # 日志器的名字:%(name)s
f2 = logging.Formatter(fmt= '%(asctime)s**%(levelname)s**%(message)s')
# 处理器设置格式器
s_handler.setFormatter(f2) #控制台处理器日志添加了指定的格式f2
f_handler.setFormatter(f1) # 文件处理器日志添加了指定的格式f1
# 输出日志
log.critical('critical日志信息') # CRITICAL:root:critical日志信息 root是默认日志器的名字
log.error('error日志信息') #ERROR:root:error日志信息
log.warning('warning日志信息')
log.info('info日志信息')
log.debug('debug日志信息')