python之停止打印日志/重复打印日志方式

 更新时间:2023年09月13日 14:47:14   作者:weixin_41956627  
这篇文章主要介绍了python停止打印日志/重复打印日志方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

python停止打印日志/重复打印日志

问题描述

用类实现了一个需求,每次实例化时,会根据传入的参数,在不同的日志文件中写入日志,即要求类的每个实例根据传参写入不同的日志文件。

运行后发现 ,运行到根据c2配置的实例 时,c2实例的日志出现在了c1的日志文件中,控制台日志也是重复的,即使把实例 del 删除也还是会打印重复日志。

主要代码如下:

class KKK
	def __init__(self, log_name, base_path)
	    self.log_name= log_name
	    self.base_path = base_path
	def start():
	    ....
	    pass
    def getLogger(self):
        # logger = logging.getLogger('%s_%d' % (self.log_name, int(time.time())))
        logger = logging.getLogger()
        logger.setLevel(logging.DEBUG)
        formatter = logging.Formatter("%(asctime)s|%(lineno)04d|%(levelname)-8s|%(message)s")
        # 控制台日志
        StreamHandler = logging.StreamHandler()
        StreamHandler.setFormatter(formatter)
        StreamHandler.setLevel(logging.INFO)
        # 较详细的日志
        FileHandler = logging.FileHandler(filename=os.path.join(self.base_path, '%s.log' % self.log_name), mode='a', encoding='utf8')
        FileHandler.setFormatter(formatter)
        FileHandler.setLevel(logging.DEBUG)
        logger.addHandler(StreamHandler)
        logger.addHandler(FileHandler)
        return logger
if __name__ == '__main__':
    c1 = {...}
    c2 = {...}
    for cc in [c1, c2]:
        kkk = KKK(**cc)
        kkk.start()

问题原因

logging.getLogger( ), 并未传递参数, 所以得到的self.logger是RootLogger。

RootLogger是一个python程序内全局唯一的,所有Logger对象的父类,对RootLogger的设定,均会影响到后续的日志。

解决办法

方法1

getLogger设置参数

logger = logging.getLogger('%s_%d' % (self.course_name, int(time.time())))

方法2

类实例销毁前清空log.handlers

    def __del__(self):
        self.stopLogger()
        pass
    def stopLogger(self):
        # for fh in self.logger.handlers:
        #     print(fh.get_name, '+++++')
        #     if isinstance(fh, logging.FileHandler):
        #         print('close handler')
        #         fh.close()
        self.logger.warning('关闭日志, %s , %s' % (self.course_name, self.logger.name))
        self.logger.handlers.clear()
        pass

python程序中断时,输出打印日志

在class中添加一个方法

def __del__(self):
     dbg.info("exit")

亲测有效!!!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python将日志写入文件超详细步骤

    python将日志写入文件超详细步骤

    在Python中logging模块是一个强大的工具,用于记录和输出应用程序的日志信息,这篇文章主要给大家介绍了关于python将日志写入文件的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • OpenCV半小时掌握基本操作之圆圈检测

    OpenCV半小时掌握基本操作之圆圈检测

    这篇文章主要介绍了OpenCV基本操作之圆圈检测,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Python提高运行速度工具之Pandarallel的使用教程

    Python提高运行速度工具之Pandarallel的使用教程

    为了提高运行速度,我们一般会采用多进程的方式。而常见的方案对于普通python玩家来说都不是特别友好,怎样才能算作一个友好的并行处理方案?本文就来和大家讲讲pandarallel的使用
    2022-09-09
  • Python echarts实现数据可视化实例详解

    Python echarts实现数据可视化实例详解

    这篇文章主要为大家详细介绍了Python echarts实现数据可视化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 教你用Python脚本快速为iOS10生成图标和截屏

    教你用Python脚本快速为iOS10生成图标和截屏

    这篇文章主要介绍了教你用Python快速为iOS10生成图标和截屏的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • Python中的类属性与实例属性区别详解

    Python中的类属性与实例属性区别详解

    这篇文章主要介绍了Python中的类属性与实例属性区别详解,类属性是在类中定义的属性,它是和这个类所绑定的,这个类中的所有对象都可以访问,实例属性是与类的实例相关联的数据值,是这个实例私有的,需要的朋友可以参考下
    2023-08-08
  • Python异步编程asyncio的核心用法与避坑指南

    Python异步编程asyncio的核心用法与避坑指南

    本文介绍了Python异步编程的基本概念、核心价值及其实现机制,并详细解释了如何通过async和await关键字来编写异步代码,同时列举了初学者常犯的错误及避免这些问题的方法,需要的朋友可以参考下
    2026-03-03
  • Python使用docxtpl库高效生成Word文档的方法

    Python使用docxtpl库高效生成Word文档的方法

    在现代办公自动化、数据报告生成、批量文档处理等场景中,如何高效、准确地生成格式统一且内容动态的Word文档,一直是开发者和业务人员关注的重点,docxtpl库凭借其简洁的API和强大的模板能力,成为生成.docx文档的首选工具之一,本文将全面、深入地介绍docxtpl库
    2026-01-01
  • python比较两个列表大小的方法

    python比较两个列表大小的方法

    这篇文章主要介绍了python比较两个列表大小的方法,涉及Python针对列表的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 详解Python中的Cookie模块使用

    详解Python中的Cookie模块使用

    这篇文章主要介绍了详解Python中的Cookie模块使用,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-07-07

最新评论