当使用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技术站