在 Try/Except 中设置 Python 记录器的级别

Setting the Level of Python's Logger inside a Try/Except

我似乎在 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 文件中读取的内容。

提前致谢。

你如何定义控件中的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")

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

设置级别
logging.getLogger().setLevel(logging.INFO)

而不是再次调用 basicConfig() 来完成。