美文网首页
【Python】logging.basicConfig无效说

【Python】logging.basicConfig无效说

作者: 宅家学算法 | 来源:发表于2021-11-30 22:12 被阅读0次

  问:下图中谁会被写入到文件“1.log”中呢?


image.png

  答:都不会

  下面来慢慢复原一下原因吧!

小科普

  默认生成的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等级一下的消息

basicConfig源码
handlers说明
3.运行到“logging.info('logger in 3')”,同日志信息配置的情况下,同样不会打印消息。

替换测试代码

import logging

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”时可以强制进行日志信息重新设置。


basicConfig新增force参数

相关文章

网友评论

      本文标题:【Python】logging.basicConfig无效说

      本文链接:https://www.haomeiwen.com/subject/tecjxrtx.html