15

Pythonのロギングモジュールを使用して、Pythonロガーを設定しています。ConfigParserモジュールを使用して、ロギングFormatterオブジェクトで使用している文字列を構成ファイルに保存したいと思います。

フォーマット文字列は、設定ファイルの読み取りと書き込みを処理する別のファイルの設定の辞書に保存されます。私が抱えている問題は、Pythonがまだファイルをフォーマットしようとし、logging-module固有のフォーマットフラグをすべて読み取るとフォールオーバーすることです。

{
    "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 に答える
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 に答える