将ExtendedInterpolation与Logging.Config.FileConfig一起使用

时间:2012-12-11 19:03:20

标签: python logging interpolation

我正在寻找一种在ini文件中加载到Logging.config.FileConfig时使用configparser lib中的ExtendedInterpolation功能的方法。

http://docs.python.org/3/library/configparser#configparser.ExtendedInterpolation

所以如果我有一个看起来像这样的ini文件:

[logSettings]
eventlogs=application
logfilepath=C:\Programs\dk_test\results\dklog_009.log
levelvalue=10

[formatters]
keys=dkeventFmt,dklogFmt

[handlers]
keys=dklogHandler

[handler_dklogHandler]
class=FileHandler
level=${logSettings:levelvalue}
formatter=dklogFmt
args=(${logSettings:logfilepath}, 'w')

[logger_dklog]
level=${logSettings:levelvalue}
handlers=dklogHandler

正如您所看到的,我遵循扩展插值语法,使用$ {...}表示法来引用不同部分中的值。当调用文件logging.config.fileConfig(filepath)时,模块内的评估总是失败。特别关注[handler_dklogHandler]部分中 args 选项的评估。

有没有办法解决这个问题?谢谢!

注意:使用Python 3.2

1 个答案:

答案 0 :(得分:2)

决定对文件使用强制插值并将结果保存到另一个临时文件中。我使用临时文件作为logconfig。

该功能如下所示:

tmpConfigDict           = {}
tmpConfig               = ConfigParser(allow_no_value = True,
                            interpolation = ExtendedInterpolation())
for path in configPaths:
    tmpConfig.read(path)

#Iterate over options and use "get()" to execute the Interpolation
for sec in tmpConfig.sections():
    tmpConfigDict[sec] = {}
    for opt, _ in tmpConfig[sec].items():
        tmpConfigDict[sec][opt] = cleanValue(tmpConfig.get(sec, opt))

#Finished getting values. Write the dict to the configparser
tmpConfig.read_dict(tmpConfigDict)

#Open the file handle and close it when done
with open(pathToTmpFile, 'w') as fp:
    tmpConfig.write(fp, space_around_delimiters = False)