python-logging模块踩坑记录-配置不生效问题

问题背景

开发一个项目的新功能时,发现运行日志不再生成了,之前使用没有问题。日志是基于python的logging模块进行配置的。
测试环境: python 3.6.10

问题原因

今天的新功能中调用了项目其他模块的代码,而那部分代码中已经使用logging模块生成了日志。logging模块是不支持追加配置的,就是说第一次使用后配置就固定了,后续再通过logging.basicConfig()配置是无法生效的。
举例说明:

情景一

import logging
logging.basicConfig(filename='./log/dev.log',level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('This is a log info')
logger.debug('Debugging')
logger.warning('Warning exists')
logger.info('Finish')

运行此段代码,日志会正常打印在对应文件中。

情景二

import logging
logger.debug('Debugging')
logging.basicConfig(filename='./log/dev.log',level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info('This is a log info')
logger.debug('Debugging')
logger.warning('Warning exists')
logger.info('Finish')

运行此段代码,不会生成对应的日志文件,因为在第二行代码运行时logging模块已经进行了配置,第三行的代码实际是没有生效的。

解决方案

在需要进行自己模块的logging配置时,先删除之前的配置,然后再重新配置。
样例代码如下:

import logging
def reset_log(log_path):
    import logging
    fileh = logging.FileHandler(log_path, 'a')
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fileh.setFormatter(formatter)
    log = logging.getLogger()  # root logger
    for hdlr in log.handlers[:]:  # remove all old handlers
        log.removeHandler(hdlr)
    log.addHandler(fileh)
    log.setLevel(logging.DEBUG)
def train():
    reset_log('./log/dev.log')
    logger = logging.getLogger(__name__)
    logger.info('This is a log info')
    logger.debug('Debugging')
    logger.warning('Warning exists')
    logger.info('Finish')
if __name__=="__main__":
    train()

在自己需要配置logging时通过reset_log这个函数,先删除之前的配置,再重新设置,就可以正常生效了。这里只是给出一个解决方案,不一定是最优的,详细的配置可以参看logging模块的说明。

参考资料

stackoverflow

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值