Python记录模块行为不一致

时间:2019-11-11 23:14:53

标签: python logging

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

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()

这应该只是将log.txt文件中的“ Gleep”写入文档。目前,它正在写入文件,但未对其写入任何内容,但是,我不一致地看到了以下行为:

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

我之前使它起作用的唯一方法是删除现有的处理程序(在上面的示例中进行了注释)。 这是在不同位置的多台计算机上。

所以...我在这里做错什么了吗?为什么日志记录模块以这种方式起作用?

1 个答案:

答案 0 :(得分:2)

我不确定如何证明/反驳/调试您的“其他”情况,但是也许以下内容可以帮助您弄清问题中代码中正在发生的事情:

首先,不需要设置 var dataString = new formData(); dataString.append('usereaddr', instockemailadr); dataString.append('sku',instockpid); //... data: dataString, success: function(){ ,因为logging.getLogger().handlers = []默认情况下是根记录器,并且没有处理程序。这是一个新鲜的Python 3.7 shell:

logging.getLogger()

(请注意,在没有任何处理程序的情况下,记录器将退回到lastResort,但这在这里是不相关的,因为您通过>>> import logging >>> logging.getLogger() <RootLogger root (WARNING)> >>> logging.getLogger().handlers [] 隐式添加了处理程序。)

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

WARNING

(这使用>>> logging.root.getEffectiveLevel() 30 而不是普通属性,因为记录器将遍历其层次结构,直到找到其级别为.getEffectiveLevel()为止。)

这就是说:就像您当前所拥有的那样,您正在从根记录程序(级别NOTSET)中记录级别为WARNING的消息对象,因此消息将无处可寻。 / p>