python 重复打印日志问题

问题:在第二次调用自己封装的日志类会出现每条日志打印两次的情况

自己封装的日志工具类:

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,就不会有一条日志打印两次的情况了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值