[解決済み] 新しいフォーマット文字列で変数データをロギングする
質問
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メッセージが記録されない場合、フォーマットは全く実行されません。
関連
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] 文字列フォーマット:% vs. .format vs. f-stringリテラル
-
[解決済み] テキストファイルを文字列変数に読み込んで、改行を除去するには?
-
[解決済み] Pythonの文字列をスペースで埋めるにはどうしたらいいですか?
-
[解決済み] Goの文字列を印刷せずにフォーマットしますか?
-
[解決済み】大文字と数字を含むランダムな文字列の生成
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] Python 言語を決定するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] バブルソートの宿題
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複