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

当使用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日

相关文章

  • Matplotlib animation模块实现动态图

    下面是详细讲解Matplotlib animation模块实现动态图的完整攻略。 1. 简介 Matplotlib是一个可视化工具,它的animation模块为我们提供了创建动态图的功能。animation模块通常使用FuncAnimation函数来生成动态图,其中可以使用用户自定义的函数来实现动态效果,同时也可以通过一些参数来控制其行为,比如进行循环、控制…

    python 2023年5月18日
    00
  • 关于python处理大型json文件的方法

    下面我将为您详细讲解“关于Python处理大型Json文件的方法”的完整攻略。 1. 背景 Json是目前应用最为广泛的数据交换格式之一,也是Http请求中常用的数据传输格式之一。当我们处理小型json文件时,可以直接通过Python内置的json库进行处理。然而,当我们处理大型json文件时,由于其数据量大,可以直接将其加载到内存中将会导致严重的性能问题。…

    python 2023年6月3日
    00
  • Python matplotlib可视化实例解析

    Python matplotlib可视化实例解析 Python的matplotlib库是一个非常强大的数据可视化工具,可以用于绘制各种类型的图表,包括折线图、散点图、柱状图、饼图等。本文将介绍如何使用matplotlib库进行数据可视化,并提供两个示例。 步骤1:安装matplotlib库 在使用matplotlib库之前,需要先安装它。可以使用以下命令在命…

    python 2023年5月15日
    00
  • 如何在Python 中获取单成员集合中的唯一元素

    获取单成员集合中的唯一元素可以使用 Python 内置函数 next(),该函数可以接收一个可迭代对象并返回对象的下一个元素。 针对单成员集合,可以使用 iter() 将其转化为一个迭代器,再用 next() 获取唯一元素。具体过程如下: # 使用iter()将集合转化为迭代器 s = set([1]) s_iter = iter(s) # 获取唯一元素 u…

    python 2023年6月3日
    00
  • Python的网络编程库Gevent的安装及使用技巧

    下面我将为你详细讲解“Python的网络编程库Gevent的安装及使用技巧”的完整攻略。 什么是Gevent Gevent是一个基于协程的Python网络编程库,它在底层使用了Libevent库来提供高效的网络IO操作,同时使用协程来避免了多线程或多进程编程中的一些问题,例如锁、死锁、上下文切换等。 Gevent提供了基于Socket和HTTP的异步网络编程…

    python 2023年5月14日
    00
  • 教你用Python实现一个轮盘抽奖小游戏

    下面是详细的攻略步骤: 1. 准备工作 首先需要安装Python,并安装一些必要的第三方库,如numpy和tkinter等等,可以使用以下命令安装: pip install numpy pip install tkinter 2. 构建轮盘 在构建轮盘的过程中,需要使用到tkinter库。首先,我们需要创建一个Canvas对象,用于绘制轮盘: import …

    python 2023年6月3日
    00
  • python实现的一只从百度开始不断搜索的小爬虫

    Python实现的一只从百度开始不断搜索的小爬虫 简介 本文介绍如何使用Python编写一个可以从百度开始不断搜索的小爬虫,并获取搜索结果中的信息。 实现步骤 安装相关库 我们需要使用requests和beautifulsoup4库进行网页的爬取和解析。可以通过以下命令安装: pip install requests beautifulsoup4 网页的爬取…

    python 2023年5月14日
    00
  • python爬取某网站原图作为壁纸

    接下来我将为您详细讲解“Python爬取某网站原图作为壁纸”的完整攻略,包含以下几个步骤: 分析目标网站 确定爬取目标 获取网站内容 解析网页数据 下载图片并保存至本地 下面,我将逐个步骤来讲解。 分析目标网站 首先,我们需要确定我们需要爬取的网站和我们要下载的壁纸。比如说,我们想要从 https://wallhaven.cc/ 这个网站上下载壁纸。网站中有…

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