问题背景
开发一个项目的新功能时,发现运行日志不再生成了,之前使用没有问题。日志是基于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模块的说明。