2012-06-19 24 views
44

pprintの出力を使用して複雑なデータ構造を表示したいが、stdoutではなくloggingモジュールを使用して出力したいと思う。loggingを使用してpprintの出力を出力

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

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

は少しよりよい何かを作り出しますこのような質問をする。それはそこにある。また、より多くの回答を受け入れる必要があります。 –

+0

私はドキュメントを見て、 'pprint({}、stream)'を見つけましたが、むしろそれはやや厄介でした。私は 'spprint'のようなものが' pformat'( 'c'のような)よりも良いかもしれないと思ったでしょう。 – yee379

+3

'pprint.pformat()'がそのページにありました。 –

答えて

93

pprint.pformatを使用して文字列を取得し、ログフレームワークに送信します。私もログインするときに名前とlevelnameを追加するフォーマッタを使用していますので、

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

迅速な対応に感謝します! – yee379

+4

デバッグが終了した後にこのコードを削除しない場合は、出力を使用しないときにpformatを実行しないようにするには、 "if Logger.isEnabledFor(logging.DEBUG):" /docs.python.org/2/library/logging.html#logging.Logger.isEnabledFor –

+0

@EdBrannin pformatは、すべてのDEBUGログステートメントに条件を追加するのに苦労するほどのオーバーヘッドを追加しますか? – undefinedvariable

9

上記の溶液はかなりは私のためにそれをカットしていませんでした。よりエレガントな解決策があるかもしれません

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

が、この:それは少しだらしない見える前にドキュメントを読むためにわざわざしてください

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

人間が消費するのに最適です。ログをlogstashなどのツールに配送していて、 1つのメッセージとして送信される単一の複数行メッセージ –

+0

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

関連する問題