目录
logging模块
logging核心组件
logger
handler
StreamHandler:把日志内容在控制台中输出
FileHandler:把日志内容写入到文件中
filter
formatter
注意日志级别的继承问题
logger.exception
上述样例的整体代码
日志的配置文件及其模板
logging的作用在使用的效果上看,其实就跟print()函数一样,哪里使用print,哪里就可以使用logging,但是logging的功能远强大于print,下面开始详细介绍
import logging
print("我是print函数")
logging.log(logging.WARNING,'我是日志的输出')
logging是Python的内置日志模块,用于生成程序日志。l
logging有五个日志级别,从低到高进行排序:DEBUG、INFO、WARMING、ERROR、CRITICAL。日志内容的记录只会记录当前设定等级及其以上的等级,例如级别为WARMING,日志的内容就只会记录WARMING、ERROR、CRITICAL,这三个级别的内容
logger默认的级别是warming
logger(记录器):可以实例化多个记录器用于记录不同的日志要求
handler(处理器):可以定义多个处理器处理不同的日志保存或发送要求
filter(过滤器):可以对记录器的选择进行筛选
formatter(格式器):可以对日志的内容进行格式化要求
logging.getLogger()
定义多个logger,通过不同的名字的来创建不同的looger
loggin.setLevel()
定义记录器的日志级别
first_logger = logging.getLogger(name='FirstLogger')
second_logger = logging.getLogger(name='SecondLogger')
second_logger.setLevel(logging.DEBUG)
print(f'first_logger:{first_logger}')
print(f'second_logger:{second_logger}')
两个经常使用的handler
参数为None,也可选:
sys.stderr、 sys.stdout
stdout,stderr的中文名字分别是标准输入,标准输出和标准错误
stream_handler = logging.StreamHandler(stream=None)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
first_logger.addHandler(stream_handler)
stream_handler.setFormatter(formatter)
first_logger.warning('warning text',)
3个主要参数,filename、mode、encoding、分别是文件名、写入模式、编码格式,大致跟一般的写入文件一致
file_handler = logging.FileHandler(filename='file_log',mode='a',encoding='utf-8')
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
first_logger.addHandler(file_handler)
file_handler.setFormatter(formatter)
first_logger.warning('warning text',)
logging.Filter()
可以过滤使用不同的记录器,可以设置记录器的名字是否与过滤条件一致
例如
second_logger记录器的名字为【SecondLogger】, third_logger记录器的名字为【aabb.ccthird_logger】,而过滤器的格式为【aabb.cc'】
两个过滤器都是使用StreamHandler但是最终只有third_logger的日志内容被打印,因为只有third_logger的名字满足过滤器的条件
third_logger = logging.getLogger('aabb.ccthird_logger')
third_logger.warning('123')
flt = logging.Filter('aabb.cc')
third_logger.addFilter(flt)
second_logger.addHandler(stream_handler)
second_logger.addFilter(flt)
second_logger.error('error text')
logging.Formatter()
可以设置不同日志内容格式,根据自身所需进行格式的规定
主要参数介绍
%(asctime)s:打印日志的时间
%(levelname)s:打印日志级别的名称
%(message)s:打印日志信息
%(filename)s:打印当前执行程序名
%(processName)s:打印线程名称
datefmt:指定时间的输出格式
formatter = logging.Formatter('======%(asctime)s - %(levelname)s - %(filename)s - %(message)s======',datefmt='%Y-%m-%d %H:%M')
没有指定日志级别,默认是WARMING
logger和handler都可以指定日志级别,最终已handler的为主,但是这里有一个点需要特别注意,
可能在指定日志级别会出现的问题,明明handler定义了DEBUG级别,可是输出时没有内容,这是因为如果logger没有指定级别,他会默认继承WARMING的最小级别,低于此级别的不会记录,所以要想设置handler的级别,建议最好先指定logger级别为DEBUG,再指定handler的级别
first_logger = logging.getLogger(name='FirstLogger')
# 没有设置logger的日志级别
# stream_handler.setLevel(logging.INFO)
stream_handler = logging.StreamHandler(stream=sys.stdout)
stream_handler.setLevel(logging.DEBUG)
first_logger.debug('debug output')
# 结果没有任何输出
设置完logger的日志级别后,才能输出对应的信息
如果只是使用logger.info等方式,不会记录过多的异常信息,但是使用logger.exception能够将详细的异常信息写入日志中去,其能将错误的类型,出错的位置进行记录,有助于项目调试
try:
a = 3 / 0
except Exception as e:
first_logger.exception(e)
import logging
import sys
first_logger = logging.getLogger(name='FirstLogger')
second_logger = logging.getLogger(name='SecondLogger')
second_logger.setLevel(logging.DEBUG)
# print(f'first_logger:{first_logger}')
# print(f'second_logger:{second_logger}')
stream_handler = logging.StreamHandler(stream=sys.stdout)
file_handler = logging.FileHandler(filename='file_log',mode='a',encoding='utf-8')
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
first_logger.addHandler(stream_handler)
stream_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
first_logger.warning('warning text',)
third_logger = logging.getLogger('aabb.ccthird_logger')
third_logger.warning('123')
flt = logging.Filter('aabb.cc')
third_logger.addFilter(flt)
second_logger.addHandler(stream_handler)
second_logger.addFilter(flt)
second_logger.error('error text')
try:
a = 3 / 0
except Exception as e:
first_logger.exception(e)
可以参考我另外一篇博客,那里有详细介绍
Python logging 日志配置文件模板_gongzairen的博客-CSDN博客