首页 > 编程语言 >Python 类初始化方法中初始化日志后,导致日志被重复打印

Python 类初始化方法中初始化日志后,导致日志被重复打印

时间:2024-11-25 17:34:16浏览次数:10  
标签:初始化 logging Python self 处理器 MyClass 日志 logger

Python 类初始化方法中初始化日志后,导致日志被重复打印

这个问题通常是由于添加处理器到同一个日志记录器上使用了全局的日志记录器,从而导致重复的日志记录。

以下是一些常见原因以及解决方法:

问题原因

  1. 日志处理器未被正确检查或清理:
    每次实例化类时,如果给日志记录器添加了新的处理器而未清理旧处理器,会导致重复日志。

  2. 使用了全局的日志记录器:
    直接使用 logging.getLogger() 而未设置局部的日志记录器,可能导致多个实例共享处理器。


示例问题代码

import logging

class MyClass:
    def __init__(self):
        self.logger = logging.getLogger("MyClass")
        self.logger.info("Logger initialized")

# 实例化多次
a = MyClass()  # 打印一次日志
b = MyClass()  # 打印两次日志
c = MyClass()  # 打印三次日志

解决方案

1. 检查并清理处理器

在类的构造函数中动态配置日志时,可以检查是否已经添加了处理器,避免重复添加。

改进后的代码:

import logging

class MyClass:
    def __init__(self):
        self.logger = logging.getLogger("MyClass")
        if not self.logger.handlers:  # 只添加一次处理器
            handler = logging.StreamHandler()
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
            handler.setFormatter(formatter)
            self.logger.addHandler(handler)
        self.logger.info("Logger initialized")

# 实例化多次
a = MyClass()  # 打印一次日志
b = MyClass()  # 无重复日志
c = MyClass()  # 无重复日志

2. 为每个类实例化独立的日志记录器

为每个类实例使用独立的日志记录器,并避免全局配置影响。

改进后的代码:

import logging

class MyClass:
    def __init__(self):
        self.logger = logging.getLogger(f"MyClass-{id(self)}")  # 使用唯一的日志名称
        self.logger.setLevel(logging.INFO)
        if not self.logger.handlers:  # 避免重复添加处理器
            handler = logging.StreamHandler()
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
            handler.setFormatter(formatter)
            self.logger.addHandler(handler)
        self.logger.info("Logger initialized")

# 实例化多次
a = MyClass()  # 每个实例独立的日志
b = MyClass()
c = MyClass()

标签:初始化,logging,Python,self,处理器,MyClass,日志,logger
From: https://www.cnblogs.com/yuzhihui/p/18568131

相关文章

  • Python知识点精汇:字典篇精汇!
    目录一、字典是什么二、字典长什么样三、字典的基本操作(1)新增元素(2)删除元素(3)清空元素(4)获取全部键值四、其他(1)字典的遍历(2)定义嵌套字典(3)字典的合并(4)返回指定的键的值,找不到键时返回预设值(5)返回指定的键的值,找不到键时,将该键更新到字典中一、字典是什么字如其名......
  • 用Python将多个txt文件合并到同一个excel中的不同sheet
    写在前面:以下代码只适用于具有同样格式的多个txt文件合并在同一个excel的不同sheet,对于将所有txt按同样的格式合并在同一个sheet的,以下代码不能实现。导入模块:importopenpyxlimportos基本信息配置:filePath=r'C:\Amy\new'#存放txt的文件夹的存......
  • python速记
    1.将列表转化为字典的方法openpyxl中的enumerate()方法【转载编辑】在Python中将列表转换为字典的10种方法_列表转字典-CSDN博客 2.获取文件是否存在模块方法1:移除一个文件可以使用os.remove(‘文件’)方法 方法2:通过异常判断逻辑defcount_words(filename)......
  • 用python、JAVA等多种语言的实例代码演示教你如何免费获取股票数据(实时数据、历史数据
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • Python 运算符总结
    Python提供了多种运算符,用于执行不同类型的操作,包括数学运算、比较、逻辑运算等。以下是Python运算符的分类与用法总结。1.算术运算符用于进行基本的数学运算。运算符描述示例结果+加法5+38-减法5-32*乘法5*315/除法5/31.666...//整除5//31%取模(余数)5%32**......
  • python获取zabbix监控项图形
    python获取zabbix图形通过zabbix的api接口获取指定时间段的监控项图形图片示例:代码示例:#-*-coding:UTF-8-*-#可根据监控项获取zabbix下所有主机的Itemid,#通过zabbix库的graphs_items表,获取graphid#本文只通过graphid直接获取图形importrequestsimportdatetime......
  • Python爬虫:获取某站视频评论+数据可视化 手把手教程
    目录前言一、获取数据1.1 使用 requests 库发送HTTP请求1.2获取'User-Agent','cookie'和视频oid二、处理数据2.1某站响应的json数据格式 2.2封装函数process_comment:选择指定字段 2.3 封装函数fetch_comments:发送HTTP请求并保存字段为xlsx文件2.4cooki......
  • 计算机毕业设计必看必学03361springboot开放实验室管理系统原创定制程序,java、PHP、p
    springboot开放实验室管理系统摘要随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是使用动态网页开发技术java作为系统的开发语言,MySQL作为后台数据......
  • 成为点灯大师的日志一——STM32之按键控制LED
    1、接线图展示注:图片来源江科大,此处3口也要接一个LED注:OLED用于检测说明按键按下2、原理说明利用按键按下过程检测到的电平变化来判断按键是否按下,通过改变Num的值来改变LED的状态利用Num的变化来实现LED多模式转换。3、代码实现Key.h#ifndef__KEY_H#define__KE......
  • 计算机毕业设计必看必学35702+springboot电影推荐系统原创定制程序,java、PHP、python
                                                              摘 要随着互联网与移动互联网迅速普及,网络上的电影娱乐信息数量相当庞大,人们对获取感兴趣的电影娱乐信息的需求越来越大,个性化的电影推荐系统成......