python logging.basicConfig不生效的原因及解决

yizhihongxing

当使用Python内置的logging模块进行日志处理时,常常会使用basicConfig()方法来进行基础配置。但是有时我们会发现,调用此方法后,程序并没有按照我们设置的规则输出日志,这就是指logging.basicConfig()不生效的情况。本文将阐述产生这种情况的原因及解决方案。

产生不生效的原因

重复调用basicConfig()

重复调用logging.basicConfig()会使之前设置的配置失效。比如下面的代码,将只输出第一条日志而不会输出第二条日志,因为第二次调用basicConfig()覆盖了第一次的配置:

import logging

logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")
logging.debug("debug1")

logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logging.info("info1")

代码中使用了其他日志处理器

如果在代码中使用了其他的日志处理器,它们会覆盖basicConfig()的设置。比如下面的代码,因为使用了FileHandler日志处理器,所以basicConfig()配置不生效:

import logging

logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")
logging.debug("debug1")

handler = logging.FileHandler("test.log")
handler.setLevel(logging.DEBUG)
handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))

logger = logging.getLogger()
logger.addHandler(handler)

logging.debug("debug2")

basicConfig()调用顺序错误

在代码中,如果basicConfig()方法调用的顺序不正确,也可能导致其配置不生效。因为logging模块是基于一个树形结构组织的,我们应该始终将其配置放在根节点处。比如,下面的代码就是一个错误的示例,因为它在创建logger对象之后才调用basicConfig()

import logging

logger = logging.getLogger('example')
handler = logging.StreamHandler()
logger.addHandler(handler)

logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")

logger.debug("debug")

解决方案

直接使用logging模块中的方法进行配置

如果出现basicConfig()配置不生效的情况,我们可以直接使用logging模块中的其他方法进行配置,来保证我们的代码生效。比如下面的代码使用addHandler()方法和设置Logger对象的basicConfig()方法来进行配置:

import logging

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug("hello world")

确保不重复调用basicConfig()

如果你调用了多次logging.basicConfig()方法,可以将它移除掉,或者在第一次调用时设置好所需的配置,避免后续代码重复调用。

import logging

logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

logging.debug("hello world")

避免与其他日志处理器冲突

在代码中同时使用多个日志处理器时,应该避免它们产生冲突。可以使用不同的Logger名称进行区分。比如下面的代码使用两个Logger分别输出日志:

import logging

logger1 = logging.getLogger("logger1")
logger2 = logging.getLogger("logger2")

handler = logging.StreamHandler()
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)

logger1.addHandler(handler)
logger1.setLevel(logging.DEBUG)

logger2.addHandler(handler)
logger2.setLevel(logging.INFO)

logger1.debug("debug1")
logger2.info("info1")

总结

在Python中使用logging模块进行日志处理时,basicConfig()是一个很重要的方法。但是我们也需要注意它不生效的情况,对于每一个失效情况,在代码中都需要进行逐一排查。本文中所提到的两个示例可以帮助你更好地理解和应用basicConfig()方法来进行日志处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python logging.basicConfig不生效的原因及解决 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • python中扫描条形码和二维码的实现代码

    让我来为您讲解一下在Python中扫描条形码和二维码的实现代码攻略。主要有以下几个步骤: 安装必要的库:为了实现扫描条形码和二维码,需要用到Python的相关库,包括python-opencv, pyzbar等,可以通过pip进行安装。在终端中输入以下命令: pip install opencv-python pyzbar 导入必要的库:在Python项目中…

    python 2023年5月18日
    00
  • python语言线程标准库threading.local解读总结

    Python语言线程标准库threading.local解读总结 为什么需要线程局部存储? 多线程编程时,会出现多个线程间共享同一个变量的情况,这时候就需要使用线程局部存储。 以常见的Web应用为例,比如Flask框架,在一个请求过程中,可能需要访问全局的数据库连接,但是如果多个请求同时进行时,就会出现线程安全问题。如果每个请求都带有自己的数据库连接,就不会…

    python 2023年5月19日
    00
  • Python中list列表添加元素的3种方法总结

    在Python中,列表(list)是一种常用的数据类型,它可以存储多个元素,而且列表的长度是动态的,可以随时添加或删除元素。本文将详细讲解Python中list列表添加元素的3种方法,并提供多个示例说明。 方法一:使用append()方法向列表末尾添加元素 append()方法是Python中最常用的向列表末尾添加元素的方法,它可以接受一个参数,将其添加到列…

    python 2023年5月13日
    00
  • Python 日期与时间转换的方法

    Python 日期与时间转换是日常开发中的常见需求。下面我介绍一些Python中日期和时间转换的相关知识以及具体的代码示例。 1. 时间戳与时间的相互转换 在Python中,可以通过time模块中的time()函数获取当前的时间戳,然后通过datetime模块中的fromtimestamp()方法将时间戳转换为datetime变量。 import time …

    python 2023年6月2日
    00
  • 如何使用Python逆向抓取APP数据

    使用Python逆向抓取APP数据,可以帮助我们获取应用程序的网络接口,获取接口数据,以及了解应用程序的网络请求逆向分析方法。下面我们将详细讲解如何使用Python逆向抓取APP数据。 1. 分析应用程序的网络接口 为了分析应用程序的网络接口,我们需要进行以下步骤: 使用抓包工具对应用程序进行网络抓包,分析应用程序的网络请求和响应。 根据抓包分析,了解应用程…

    python 2023年5月14日
    00
  • Python函数关键字参数详解

    在Python函数中,关键字参数是一种通过参数名称传递值的方法,而不是按照参数在函数定义中的顺序进行传递。使用关键字参数可以使代码更具可读性,并且可以方便地忽略函数定义中的一些参数。以下是Python函数关键字参数的用法: 定义函数时使用关键字参数 在定义函数时,可以使用关键字参数来指定函数参数的默认值。这样,在调用函数时,如果没有传递参数,则使用默认值。例…

    2023年2月20日
    00
  • Python中号称神仙的六个内置函数详解

    下面是Python中号称神仙的六个内置函数的详解攻略。 标题 1. map()函数 map()函数可以将一个函数作用于一个可迭代对象中的每个元素,并返回一个新的可迭代对象。 map(function, iterable) 示例1: l = [1, 2, 3] def f(x): return x**2 list(map(f, l)) 输出:[1, 4, 9]…

    python 2023年5月14日
    00
  • python判断一个集合是否包含了另外一个集合中所有项的方法

    判断一个集合是否包含了另外一个集合中所有项的方法可以使用Python中的issuperset()函数,该函数可以判断一个集合是否是另一个集合的超集。 语法格式: set1.issuperset(set2) 其中,set1是被判断的集合,set2是要判断的集合。 当set1包含set2中所有元素时返回True,否则返回False。 下面来看两个使用issupe…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部