python中logging会重复写日志的问题分析

 

现象


小强python全栈自动化测试班的学员问到,会出现重复写日志的情况,如下

 

原因


 

当第二次调用log的时候,根据getLogger(name)里的name获取同一个logger,而这个logger里已经有了第一次你添加的handler,第二次调用又添加了一个handler,也就是说这个logger里有了两个同样的handler,所以就会出现调用几次就会有几个handler

 

解决方案


在日志记录完之后removeHandler

例如:logger.removeHandler(streamhandler)

 

除此之外你也可以去判定下,如果logger.handlers列表为空,则添加,否则,直接去写日志,例如

 

if not logger.handlers:
    xxxx

logger.error('百度搜索:小强测试品牌')

 

### 回答1: Pythonlogging 模块提供了一种方便的方法来记录应用程序的信息,包括错误、警告、调试信息等。如果你的应用程序在多个地方使用 logging 模块来记录信息,可能导致日志文件出现重复的信息。 为了防止这种情况,可以通过以下几种方式来避免重复生成日志: 1. 设置日志记录器的级别。使用不同的日志级别来记录不同类型的信息。在创建日志记录器时,可以设置其级别。如果某个日志记录器的级别设置为 DEBUG,那么所有 DEBUG 及以上级别的信息都被记录下来。如果将日志级别设置为 WARNING,则只记录 WARNING、ERROR 和 CRITICAL 级别的信息。这样,就可以避免重复记录同样级别的信息。 2. 避免重复设置日志处理器。在使用 logging 模块时,通常创建多个日志处理器。如果多个处理器都记录相同的信息,就导致日志文件出现重复的信息。为了避免这种情况,可以在代码检查是否已经创建了相同类型的处理器,如果已经创建,则不需要再创建。 3. 避免重复添加日志处理器。在某些情况下,可能需要将同一种类型的处理器添加到多个日志记录器。如果多个日志记录器都添加了同样的处理器,就导致重复记录信息。为了避免这种情况,可以在代码检查是否已经将处理器添加到了相应的日志记录器,如果已经添加,则不需要再添加。 综上所述,可以通过设置日志记录器的级别、避免重复设置日志处理器和避免重复添加日志处理器等方式来避免重复生成日志。 ### 回答2: Pythonlogging模块在使用过程,可能出现重复生成日志的情况。主要有以下几种可能原因: 1. 多次调用`logging.basicConfig()`方法:`basicConfig()`方法用于设置日志的基本配置,如果在代码多次调用这个方法,导致重复生成日志。解决方法是只在代码调用一次`basicConfig()`,或者使用`logging.getLogger()`方法来获取logger对象,再进行设置。 2. 多次添加了相同日志处理器:如果在代码多次添加了相同的处理器(如FileHandler、StreamHandler等),导致重复生成日志。解决方法是在添加处理器之前,先检查是否已经添加过相同类型的处理器,避免重复添加。 3. 日志级别设置不当:如果在代码设置了多个处理器,并且给每个处理器设置了相同日志级别,就导致重复生成日志。这是因为每个处理器都接收到同样级别的日志消息。解决方法是根据需求,为每个处理器设置不同的日志级别,避免重复记录。 4. 多线程环境下的竞争条件:在多线程环境下,如果多个线程同时调用日志记录方法,可能导致消息重复记录。这是因为多个线程同时操作日志记录器。解决方法是使用线程安全的日志记录器,如`logging.getLogger()`返回的logger对象就是线程安全的。 综上所述,要避免Pythonlogging模块重复生成日志,需要注意在代码的使用方式,避免多次调用`basicConfig()`方法、重复添加处理器和设置相同日志级别,同时在多线程环境下使用线程安全的日志记录器。 ### 回答3: 在Pythonlogging模块提供了记录日志的功能。当出现重复生成日志的情况时,一般是由于以下原因: 1. 多次调用了logging模块的配置函数:在程序多次调用配置logging的函数,导致重复生成log。为避免重复生成log,在程序的入口处或配置模块应只调用一次配置函数。 2. 多次添加了相同日志处理器:在配置logging模块时,如果多次添加了相同日志处理器,比如多次调用`addHandler()`函数,则导致相同日志信息被多次记录,从而重复生成log。为避免此问题,应仅在配置函数添加一次处理器。 3. 日志级别设置不合理:如果设置的日志级别过低,比如DEBUG级别,将所有级别的日志都记录下来,从而导致重复生成log。应根据需求设置适当的日志级别,只记录需要的信息。 4. 并发多线程或多进程日志:如果多个线程或进程同时入同一个log文件,可能导致日志信息重复。为避免此问题,可以在日志时使用线程锁或文件锁,以确保每次入的日志重复。 总之,避免重复生成log的关键是正确地配置logging模块、合理设置日志级别,并注意线程或进程之间的并发入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小强测试

不要打赏我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值