【问题标题】:Setting the Level of Python's Logger inside a Try/Except在 Try/Except 中设置 Python 记录器的级别
【发布时间】:2015-01-13 18:13:13
【问题描述】:

我似乎在用 Python 设置记录器时遇到了一些麻烦。我正在尝试从控件中读取程序控制的值(海洋学模拟,有很多小的调整因素,最好将它们隔离在某个文件中,因为我们倾向于与它们一起玩)文件(基于 JSON)。其中包括应该设置日志记录的级别。由于这是我希望人们可能拼写错误并且 Python 非常严格的东西,我正在尝试将记录器设置包装在 try-except 中,如果出现错误(并给出警告),它将默认返回 INFO,如图所示:

with open(control['outFileStem'] + "_log.info", 'w'):
    pass #Clear an existing logfile
#Then set up the logging
try:
    logging.basicConfig(filename = control['outFileStem'] + "_log.info", level = control['logLevel'])
except ValueError:
    control['logLevel'] = "INFO"
    logging.basicConfig(filename = control['outFileStem'] + "_log.info", level = logging.INFO)
    logging.warning('WARNING: Logging Level set to INFO')

logging.info('Control structure created successfully')

但是,当我通过修改控制文件中的级别进行实验时,它专门将级别设置为警告。无论我为关卡使用哪种变体(即 logging.INFO、数字代码、从控制对象调用值而不是将其放入自己等)都会发生这种情况。我无法弄清楚这里发生了什么.

如果它是相关的,控制是一个字典,我已经改变了 init 方法来处理从 JSON 文件中读取的内容。

提前致谢。

【问题讨论】:

    标签: python logging exception-handling


    【解决方案1】:

    请注意,如果根记录器上已经存在处理程序,basicConfig()(如文档所述)不会执行任何操作。 basicConfig() 实现首先设置处理程序,最后设置级别,因此如果此时它失败,则处理程序已经设置并且except 子句中的basicConfig() 调用什么也不做。最简单的解决方案是,在异常子句中,使用设置级别

    logging.getLogger().setLevel(logging.INFO)
    

    而不是再次调用basicConfig() 来做这件事。

    【讨论】:

      【解决方案2】:

      你如何定义控制中的logLevel(它是什么类型)?

      你怎么看?

      #!/usr/bin/env python
      
      import logging
      
      control = {"logLevel": "FAKE"}
      
      # get log level object which is just a number
      try:
          log_level = getattr(logging, control["logLevel"])
      except AttributeError as ex:
          log_level = logging.INFO
      
      logging.basicConfig(filename = "logfile", level = log_level)
      
      
      logging.debug("debug test")
      logging.info("info test")
      logging.warn("warn test")
      logging.error("error test")
      

      【讨论】:

      • 我尝试使用 logLevel 作为数字、字符串(例如“INFO”)和 logging.WHATEVER 类型。所有 3 个在 Try: 中都可以正常工作,但在除了:您的建议有效(谢谢!)但我仍然看不出我原来的 sn-p 是如何...?
      • 对我来说,logging.basicConfig 不会抱怨奇怪的日志级别。你确定异常被触发了吗?除非我看到配置 json 文件,否则我无法自己测试它。例如,这不会触发异常:logging.basicConfig(filename = "logfile", level = "broken")
      • 它肯定会被触发;我已经放入了一些 print() 语句来检查。对我来说,如果我试图传递任何不寻常的东西,它就是一个 ValueError。我使用的是 Python 3.4,可能是版本不同?
      • 我使用的是 3.4。 basicConfig(在我机器上的 /usr/lib/python3.4/logging/__init__.py 中定义)在执行之前检查根处理程序(如果 len(root.handlers) == 0)。是什么价值观让它失败了?
      • 它接受 logging.FOO 对象、数值 (0,10,20,30,40,50) 和级别的名称(例如 INFO)作为字符串。其他任何事情都会导致它失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2019-06-26
      • 2014-09-16
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多