赞
踩
自己封装的日志工具类:
- import logging
- import os
- from config import project_config as config
- # 2.创建日志工具类对象,在其内部 日志对象做初始化
- class LoggingUtil(object):
- """
- 日志工具类,初始化日志对象
- """
- def __init__(self,name=None,level=logging.INFO) -> None:
- self.logger = logging.getLogger(name)
- self.logger.setLevel(level)
- # 3.定义init_log()方法,用于获取具体的日志对象
- def init_log(name=None):
- # 创建日志对象
- logger = LoggingUtil(name).logger
- # 创建日志处理对象
- # handler = logging.FileHandler('D:/python_workplace/pythonProject/python_etl/log/my.log/',mode='a',encoding='utf-8')
- file_name = os.path.join(config.log_root_path,config.log_file_name)
- if not logger.handlers:
- handler = logging.FileHandler(file_name,mode='a',encoding='utf-8')
- # 创建日志格式对象
- fmt = logging.Formatter('%(asctime)s\t [%(levelname)s] \t %(filename)s[%(lineno)d]: \t%(message)s ')
- # 配置对象间关系
- handler.setFormatter(fmt)
- logger.addHandler(handler)
- return logger

在其他包中第一次调用,使用init_log创建出logger对象,打印出的日志没有问题
- from util import log_uitl
- # 创建一个日志对象
- logger = log_uitl.init_log()
在第三个包中再次调用init_log并传入名字,会出现一条日志打印两次的问题
- from util import log_uitl
- # 创建一个日志对象
- logger = log_uitl.init_log('by_lucky_dog')
经过查询资料,判断问题所在是通过init_log函数创建出的对象,会创建出两个handler来处理日志,但是已经做了是否存在handler判断,为什么还会有两个handler呢
猜测:第一次没穿参数,第二次传参数了
第一次尝试:将两次调用init_log函数都传入参数,且传入参数一致
结果:日志打印一遍
第二次尝试:两次调用init_log函数都不传入参数
结果:日志打印一遍
第三次尝试:两次调用init_log函数都传入参数,且参数不一致
结果:日志打印一遍
发现:只有一个传参,一个不传参数时候会出现一条日志打印两边的情况
查看源码:
发现传参和不传参走的是两条路径,分析可能是这里导致创建出了两个handler
第四次尝试:第二次导包时直接使用LoggingUtil类创建初始化对象,不调用init_log函数,并一个传入名字参数,一个不传参数
结果:日志打印一遍
方案一:只在第一次导入日志工具类时调用init_log函数,其余使用第四次尝试中的方法创建初始化对象
方案二:在工具类初始化时直接传入一个默认参数,这样创建出的对象都会有一个名字参数,也不会创建出两个handler,就不会有一条日志打印两次的情况了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。