在 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()
来完成。
我似乎在 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()
来完成。