1. ホーム
  2. python

[解決済み] 新しいフォーマット文字列で変数データをロギングする

2023-03-29 22:50:41

質問

Python 2.7.3のロギング機能を使っています。 このPythonのバージョンのためのドキュメントは言う :

<ブロッククオート

logging パッケージは str.format() や string.Template のような、より新しいフォーマットオプションより前のものです。これらの新しいフォーマットオプションはサポートされています...

私は中括弧を使った'新しい'書式が好きです。だから、私は次のようなことをしようとしています。

 log = logging.getLogger("some.logger")
 log.debug("format this message {0}", 1)

とエラーが出ます。

TypeError: 文字列フォーマット中にすべての引数が変換されたわけではありません。

何を見逃したのか?

追記:私は

log.debug("format this message {0}".format(1))

この場合、メッセージはロガーレベルに関係なく常にフォーマットされるからです。

どのように解決するのですか?

EDITです。 を見てみましょう。 StyleAdapter のアプローチを見てください。 この回答とは異なり、ロガーのメソッド(debug(), info(), error(), etc)を呼び出すときに、定型文なしで代替フォーマットスタイルを使用することができます。


ドキュメントから 代替書式スタイルの使用 :

<ブロッククオート

ロギング呼び出し (logger.debug(), logger.info() など) は、実際のロギングメッセージ自体の位置パラメータのみを取ります。 実際のロギングメッセージ自体のための位置パラメータのみを取り、キーワードパラメータは、ロギングメッセージをどのように処理するかのオプションを決定するためにのみ使用されます。 キーワードパラメータは、実際のロギング呼び出し (たとえば 実際のロギング呼び出しをどのように処理するかのオプションを決定するためにのみ使用されます (例えば、exc_info キーワードパラメータは、トレースバック情報をロギングすることを示します)。 トレースバック情報がログ収集されることを示す exc_info キーワードパラメータや、 追加のコンテキスト情報を示す extra キーワードパラメータはログに追加される追加的なコンテキスト情報を示すため を追加するための extra キーワードパラメータ)。そのため str.format() や string.Template 構文を使って直接ロギングを呼び出すことはできません。 パッケージは内部的に %-formatting を使ってフォーマット文字列と変数 引数をマージするからです。後方互換性を維持したまま、これを変更することはできません。 既存のコードにあるすべてのロギングコールは、%-format を使うので、後方互換性を保ちながらこれを変更することはできません。 コードにあるすべてのロギング呼び出しは、%-format 文字列を使用します。

そして

<ブロッククオート

しかし、{}-と$-の書式を使って、個々のログメッセージを作成する方法があります。 を使用して個々のログメッセージを作成する方法があります。メッセージのために はメッセージのフォーマット文字列として任意のオブジェクトを使用することができ、ロギングパッケージはそのオブジェクトの str() を呼び出します。 ロギングパッケージはそのオブジェクトの str() を呼び出して、実際の を呼び出して実際の書式文字列を取得します。

これをコピーペーストして wherever モジュールにコピーしてください。

class BraceMessage(object):
    def __init__(self, fmt, *args, **kwargs):
        self.fmt = fmt
        self.args = args
        self.kwargs = kwargs

    def __str__(self):
        return self.fmt.format(*self.args, **self.kwargs)

では

from wherever import BraceMessage as __

log.debug(__('Message with {0} {name}', 2, name='placeholders'))

例えば、DEBUGメッセージが記録されない場合、フォーマットは全く実行されません。