ログを使用してpprintの出力を印刷


99

pprintの出力を使用して複雑なデータ構造を表示したいのですが、標準出力ではなくロギングモジュールを使用して出力したいと思います。

ds = [{'hello': 'there'}]
logging.debug( pprint.pprint(ds) ) # outputs as STDOUT

私はドキュメントをちらっと見て、見つけましpprint( {}, stream )たが、かなりぎこちないことがわかりました。のようなものspprintpformat(のようにc)良いかもしれないと思ったでしょう。
yee379

6
pprint.pformat()そのページにありました。
Gareth Latty、2012年

27
@Lattywayre-このような質問をするすべての人がドキュメントをスキップしたわけではありません。私は同じドキュメントを読み、pformatも見逃しました。stackoverflowでは、ドキュメントにまったく含まれていない他の人の経験から宝石を受け取ることもあります。これを尋ねてくれてありがとうyee379。
Mnebuerquo 2014

回答:


209

を使用pprint.pformatして文字列を取得し、それをロギングフレームワークに送信します。

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))

11
デバッグが完了した後でこのコードを削除しない場合は、「if Logger.isEnabledFor(logging.DEBUG):」で保護して、出力を使用しないときにpformatが実行されないようにする必要があります:docs.python。 org / 2 / library /…
Ed Brannin 2013

1
@EdBrannin pformatは、すべてのDEBUGログステートメントに条件を追加するという問題に値するほどのオーバーヘッドを追加しますか?
undefinedvariable

2
@undefinedvariable良い質問です。Me-todayは、Me-2年前にいくつかのA / Bパフォーマンスメトリックを生成するように指示します。
Ed Brannin

1
私が取得するAttributeError: 'function' object has no attribute 'pformat'理由は考えて?
JinSnow 2017年

3
解決策:必要from pprint import pprint,pformat だったlogging.debug((pformat(stuff))
JinSnow 2017年

20

上記の解決策では、ロギング時に名前とレベル名を追加するためにフォーマッタを使用しているため、それを完全に削減できませんでした。少し乱雑に見えます:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
'bbbbbbbbbbbbbbbbbbbb',
'cccccccccccccccccccc',
'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text

よりエレガントな解決策があるかもしれませんが、これは:

for line in pprint.pformat(ds).split('\n'):
    logging.debug(line)

もう少し良いものを生成します:

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
__main__    : DEBUG   :  'bbbbbbbbbbbbbbbbbbbb',
__main__    : DEBUG   :  'cccccccccccccccccccc',
__main__    : DEBUG   :  'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text

14
人間の消費に適しています。ログをlogstashまたは同様のツールに配布していて、単一の複数行メッセージを1つのメッセージとして送信する場合は、それほど優れていません。
Charles Duffy

5
ロガー構成のハンドラー/フォーマッターレベルできれいに印刷する方法はありますか?コンソールにきれいに出力するには有効なユースケースのようですが、フォーマットされていないファイルに移動します
jon_darkstar

@CharlesDuffy両方のケースを処理する簡単な方法はありますか?
jtlz2

1
Fwiw私の解決策は\n、pformatに余分な文字を追加することです。少なくともこの方法でブロックは一緒です。
ricekab
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.