在Try / Except中设置Python的Logger级别

时间:2015-01-13 18:13:14

标签: python logging exception-handling

我似乎在使用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文件读取的干净利落。

提前致谢。

2 个答案:

答案 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()来执行此操作。