Python 日志记录级别随机更改,并不总是写入文件

Python 日志记录级别随机更改,并不总是写入文件,python,logging,Python,Logging,我有一段代码可以用Python设置我的记录器: #Configure logging logging.basicConfig(format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s', datefmt='%m-%d %H:%M', filename= "log.txt", level = l

我有一段代码可以用Python设置我的记录器:

  #Configure logging
  logging.basicConfig(format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                      datefmt='%m-%d %H:%M',
                      filename= "log.txt",
                      level = logging.getLevelName('DEBUG'))


  print(logging.getLogger().getEffectiveLevel())
但print语句的输出有时是这样的:

30
其他时间是这样的(这是正确的):

但通常,即使将日志记录级别设置为正确的数字,它也不会将任何内容记录到文件中,但在其他情况下,它可以工作。我需要做什么来确保我的日志记录级别设置正确

*编辑:以下是我根据@randomir推荐的解决方案。 **编辑:在调用
logging.basicConfig()
之后,我必须对日志级别进行第二次更改,否则日志级别仍然无法得到一致的调用。行'logging.getLogger().setLevel(…)现在似乎可以工作了

我创建了一个新类:Logger.py

import logging

class Logger(object):
   def __init__(self):
     logging.basicConfig(format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                      datefmt='%m-%d %H:%M',
                      filename= "log.txt")

     logging.getLogger().setLevel(logging.getLevelName("DEBUG"))

     print(logging.getLogger().getEffectiveLevel())
现在,我不再直接在startup类中配置基本配置,而是实例化logger类一次:

from Logger import Logger
import logging

class LaunchPython(object):
  #Configure Logging
  Logger()

  logging.info("Application has started")
在调用记录器的所有后续类中,我只是将
import logging
放在顶部,然后执行
logging.info(…)
logging.debug(…)
。不需要导入Logger.py类并重新实例化它。

为您的应用程序创建一个根记录器(这是一个名为
root
的记录器,您可以通过
logging.getLogger('root')
,或
logging.getLogger()
)获得它)

诀窍在于,如果日志记录函数(如
logging.info()
)不存在,则在第一次调用任何日志记录函数(如
logging.info()
)时,使用默认值(如
level=30
)创建
根日志记录程序。因此,请确保在登录应用程序的任何其他部分之前调用
basicConfig()

您可以通过将记录器配置提取到一个单独的模块,如
logger.py
,然后在每个模块中导入该模块来实现这一点。或者,如果您的应用程序有一个中心入口点,只需在那里进行配置即可。请注意,您调用的第三方函数还将创建
root
记录器(如果不存在)

另外请注意,如果您的应用程序是多线程的:

注意 在启动其他线程之前,应该从主线程调用此函数。在2.7.1和3.2之前的Python版本中,如果从多个线程调用此函数,则可能(在极少数情况下)将处理程序多次添加到根日志记录器,从而导致意外结果,例如日志中的消息被复制


你有更多的上下文吗?如果我简单地复制/粘贴您的代码样本并运行它,我会得到10。您是否在任何地方都使用相同的记录器?是否声明一次,然后导入到所有模块中?@Finch_通常在我第一次从新的QT控制台运行应用程序时,它会输出正确的调试编号,但如果我随后运行它,它会开始大部分输出30。@PRMoureu我在任何地方都使用默认的记录器(
logging.info(…)
)。有时一切正常,日志文件被正确写入,但有时它只被部分写入,但更恼人的是调试级别并没有保持不变。您可能会遇到竞争条件,有时,在调用
logging.basicConfig
之前,将创建记录器。是的,创建一个单独的logger.py类非常有效。我添加了一个根据您的建议创建的解决方案。
from Logger import Logger
import logging

class LaunchPython(object):
  #Configure Logging
  Logger()

  logging.info("Application has started")