15

我使用 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 做任何重要的事情(或日志记录)。

在此先感谢,多米尼克

4

6 回答 6

18

您是否尝试使用 来逃避百分比%%

于 2010-03-29T12:55:38.430 回答
15

您可能想使用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"
}
于 2010-03-29T13:21:17.597 回答
13

您还可以使用插值设置为None.

config = ConfigParser(strict=False, interpolation=None)

(我正在使用 Python 3.6.0

于 2017-03-01T23:39:20.207 回答
5

RawConfigParser就像没有ConfigParser插值行为一样。如果您不在配置文件的任何其他部分使用插值功能,您可以在代码中简单地ConfigParser替换为。RawConfigParser

有关详细信息,请参阅RawConfigParser的文档。

于 2010-03-29T13:21:33.273 回答
1

你使用的是什么版本的 Python?升级到 2.6.4 可能会有所帮助,请参阅

http://bugs.python.org/issue5741

于 2010-03-29T14:16:17.080 回答
0

上面的代码有什么问题?%仅当将运算符应用于字符串时才执行插值。如果您不使用%,您可以像使用任何其他字符串一样使用格式化字符串。

于 2010-03-29T13:02:47.703 回答