我似乎在使用Python设置记录器时遇到了麻烦。我试图读取控制程序的值(海洋模拟,有很多很小的调整因子,最好保存在文件中的某个地方,因为我们倾向于使用它们一点点)控制文件(基于JSON)。其中包括应设置日志记录的级别。由于这是我希望人们可能拼错并且Python非常严格的事情,我试图将记录器设置包装在一个尝试 - 除非如果出现错误将其默认为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')
但是,当我通过修改控制文件中的级别来实验它时,它会将级别专门设置为WARNING。无论我使用哪种变体(即logging.INFO,数字代码,从控制对象调用值而不是将其放入自己等等),都会发生这种情况。我无法弄清楚&# 39; s继续在这里。
如果它是相关的,那么控制就是一个词典,我已经改变了 init 方法来处理从JSON文件读取的干净利落。
提前致谢。
答案 0 :(得分:0)
如何在控件中定义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")
答案 1 :(得分:0)
请注意,如果根记录器上已存在处理程序,basicConfig()
(如文档所述)不会执行任何操作。 basicConfig()
实现首先设置处理程序,最后设置级别,因此如果它在那时失败,则处理程序已经设置,并且basicConfig()
子句中的except
调用不执行任何操作。最简单的解决方案是,在例外条款中,使用
logging.getLogger().setLevel(logging.INFO)
而不是再次调用basicConfig()
来执行此操作。