我使用python的日志记录模块设置了一个python记录器。我想使用ConfigParser模块将我正在使用的字符串与记录Formatter对象存储在配置文件中。
格式字符串存储在单独文件中的设置字典中,该文件处理配置文件的读取和写入。我遇到的问题是python仍然试图格式化文件,并在读取所有特定于日志模块的格式化标志时失败。
{
"log_level":logging.debug,
"log_name":"C:\\Temp\\logfile.log",
"format_string":
"%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s"
}
我的问题很简单:如何在此处禁用格式化功能,同时将其保留在其他位置。我最初的反应是大量使用反斜杠来逃避各种百分比符号,但这当然会永久地打破格式化,即使我需要它也不会工作。
我还应该提一下,因为它在评论中被买了,所以ConfigParser做了一些导致跳闸的内部插值。这是我的追溯:
Traceback (most recent call last):
File "initialconfig.py", line 52, in <module>
"%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s"
File "initialconfig.py", line 31, in add_settings
self.set(section_name, setting_name, default_value)
File "C:\Python26\lib\ConfigParser.py", line 668, in set
"position %d" % (value, m.start()))
ValueError: invalid interpolation syntax in '%(asctime)s %(levelname)s: %(module
)s, line %(lineno)d - %(message)s' at position 10
此外,关于良好设置 - 文件实践的一般指示会很好。这是我第一次使用ConfigParser做任何重要的事情(或记录此事)。
提前致谢, 星
答案 0 :(得分:11)
您是否尝试使用%%
转换百分比?
答案 1 :(得分:9)
您可能希望使用ConfigParser.RawConfigParser
代替ConfigParser.ConfigParser
。只有后者才会对配置值进行神奇插值。
修改强>
实际上,使用ConfigParser.SafeConfigParser
,您可以使用额外的%
百分号来转义格式字符串。这个例子应该正常工作:
{
"log_level":logging.debug,
"log_name":"C:\\Temp\\logfile.log",
"format_string":
"%%(asctime)s %%(levelname)s: %%(module)s, line %%(lineno)d - %%(message)s"
}
答案 2 :(得分:5)
RawConfigParser
与ConfigParser
类似,没有插值行为。如果您不在配置文件的任何其他部分使用插值功能,则只需在代码中将ConfigParser
替换为RawConfigParser
。
有关详细信息,请参阅RawConfigParser的文档。
答案 3 :(得分:3)
您也可以使用插值设置为None
。
config = ConfigParser(strict=False, interpolation=None)
(我正在使用Python 3.6.0
)
答案 4 :(得分:1)
上面的代码有什么问题?仅当%
运算符应用于字符串时才执行插值。如果您不使用%
,则可以像使用任何其他字符串一样使用格式化字符串。
答案 5 :(得分:1)
您使用的是哪个版本的Python?升级到2.6.4可能会有所帮助,请参阅