Dunesの回答に記載されているキーワードの問題がない別のオプションがあります。位置({0}
)引数のみを処理でき、キーワード({foo}
)引数は処理できません。また、フォーマットするために2回呼び出す必要はありません(アンダースコアを使用)。それはサブクラス化のick-factorを持っていますstr
:
class BraceString(str):
def __mod__(self, other):
return self.format(*other)
def __str__(self):
return self
class StyleAdapter(logging.LoggerAdapter):
def __init__(self, logger, extra=None):
super(StyleAdapter, self).__init__(logger, extra)
def process(self, msg, kwargs):
if kwargs.pop('style', "%") == "{":
msg = BraceString(msg)
return msg, kwargs
あなたはそれをこのように使います:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
もちろん、で示されたチェックを削除し# optional
て、アダプタを介したすべてのメッセージに新しいスタイルのフォーマットを使用させることができます。
数年後にこの回答を読んだ人への注意:Python 3.2以降、オブジェクトでstyleパラメーターを使用できFormatter
ます。
ロギング(3.2以降)は、これら2つの追加のフォーマットスタイルのサポートを改善します。Formatterクラスが拡張され、style
。という名前の追加のオプションのキーワードパラメーターを受け取るようになりました。このデフォルトは'%'
、他の可能な値である'{'
と'$'
他の二つのフォーマットのスタイルに対応します。下位互換性はデフォルトで維持されますが(予想どおり)、スタイルパラメータを明示的に指定することで、str.format()
または
で機能するフォーマット文字列を指定できますstring.Template
。
ドキュメントは例を提供します
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
この場合でもlogger
、新しい形式でを呼び出すことはできません。つまり、次はまだ機能しません。
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)