Python日志模块

2024-09-30 16:42:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我看到一些非常奇怪的行为与记录器模块。一开始是一个相对复杂的项目,但现在我看到了以下脚本:

import logging
import os

# Uncomment the following line to remove handlers
# logging.getLogger().handlers = [] 

filePath = os.environ['userprofile']  + r'\Documents\log.txt'
logging.basicConfig(filename=filePath)
logging.debug('Gleep')
logging.shutdown()

这只需将“Gleep”写入log.txt文件到您的文档中。当前它正在写入文件,但没有向其中写入任何内容,但是,我不一致地看到以下行为:

  1. 列表项
  2. 根本没有写入日志文件
  3. 已创建日志文件,但未写入任何内容
  4. 一切正常

我以前让它工作的唯一方法是删除现有的处理程序(在上面的示例中注释掉)。 这在不同位置的多台机器上进行

那么…我是不是做错什么了?为什么日志模块是这样工作的


Tags: 模块文件项目importtxt脚本log内容
1条回答
网友
1楼 · 发布于 2024-09-30 16:42:00

我不确定如何证明/反驳/调试您的“其他”情况,但以下内容可能有助于从您的问题中澄清代码中发生了什么:

首先,设置logging.getLogger().handlers = []应该而不是是必要的,因为logging.getLogger()在默认情况下是根记录器,并且没有处理程序。下面是一个新的Python 3.7 shell:

>>> import logging
>>> logging.getLogger()
<RootLogger root (WARNING)>
>>> logging.getLogger().handlers
[]

(请注意,在没有任何处理程序的情况下,记录器将返回到^{},但这与此无关,因为您通过basicConfig()隐式添加了处理程序。)

这将带您到logging.basicConfig(filename=filePath):这将向根记录器添加一个FileHandler处理程序。它不触及根记录器的级别,默认情况下为WARNING,因此您的消息不会通过“级别测试”,也不会因此而发出

>>> logging.root.getEffectiveLevel()
30

(这将使用.getEffectiveLevel()而不仅仅是plain属性,因为如果日志记录器的级别是NOTSET,它将遍历其层次结构直到找到一个级别。)

所有这一切都意味着:正如您当前所拥有的,您正在从根记录器(levelWARNING)记录一个具有levelDEBUG的消息对象,因此消息将不存在


相关问题 更多 >