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

时间:2017-07-06 19:22:32

标签: 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 = logging.getLevelName('DEBUG'))


  print(logging.getLogger().getEffectiveLevel())

但是print语句的输出有时是这样的:

30

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

10

但是,即使将日志记录级别设置为正确的数字,它也不会将任何内容记录到文件中,但有时也可以。我需要做些什么来确保我的日志记录级别设置正确?

*编辑:以下是基于@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())

现在我没有直接在我的启动类中配置基本配置,而只是实例化一次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类并重新实例化。

1 个答案:

答案 0 :(得分:3)

logging.basicConfig()为您的应用程序创建了一个根记录器(该记录器名为root,您可以使用logging.getLogger('root')logging.getLogger()获取该记录器

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

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

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

  

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