默认生成的root logger的level是logging.WARNING,低于该级别的就不输出。
级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG
debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上
info : 打印info、warning、error、critical级别的日志,确认一切按预期运行
warning : 打印warning、error、critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来
error : 打印error、critical级别的日志,更严重的问题,软件没能执行一些功能
critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行
1.进入main.py,首先“import log”,运行到“logging.info('logger in 2') ”。该步骤自动默认生成root logger,level等级是logging.WARNING,那么info低于该级别不输出且尚未设置basicConfig,也不会写入“1.log”
2.运行到“log.init_log()”,开始调用函数,运行“logging.basicConfig”进行日志信息配置,后运行“logging.info('logger in 1')”。
重点来了:
根据basicConfig源码可以发现只有当“handlers”的长度为0时才会进行日志信息配置,否则跳过该配置步骤。那么在步骤1中root已经自动进行了日志信息配置,“handlers”的长度不为0,则步骤2中的“logging.basicConfig”并没有达到日志信息配置的作用。进而,按照原先的日志信息配置设置:
不会生成“1.log”文件,不会打印logging.WARNING等级一下的消息
。
logging.info('logger in 0') # 注释这个则正常运行,不注释则basicconfig设置失效
logging.basicConfig(
# filename='1.log',
# filemode='w',
force = True,
format='%(asctime)-15s %(threadName)s:%(message)s',
level=logging.INFO,
logging.info('logger in 1')
logging.warning('logger in 2')
根据上面的测试说明,可以得出一点:如果希望basicConfig设置有效,那么必须在log之前进行设置,在root logger之后就无法再通过basicConfig更改配置(如果强行将handlers设为空理论上时可以的,本人暂未测试)。
但是,针对这个情况python做了更改,在python3.8及之后在basicConfig中新增了force参数,当“force=True”时可以强制进行日志信息重新设置。