Pythonでは、なぜprintの代わりにloggingを使用するのですか?


95

複雑なプロジェクトでの単純なデバッグの場合、印刷の代わりにPythonロガーを使用する理由はありますか?他のユースケースはどうですか?それぞれに受け入れられている最良のユースケースはありますか(特に、stdoutのみを探している場合)?

これは「ベストプラクティス」だといつも聞いていますが、その理由がわかりません。


4
大規模なプロジェクトの場合、ロギングは常に「ベストプラクティス」です。これは、ロギングを簡単にオンまたはオフにし、多かれ少なかれ情報を取得できるためです。印刷には、これらの利点はありません。
Chris Eberle 2011

1
つまり、blog.tplus1.com
index.php

3
私はないと思う今までのための最高のユースケースはprint
singleNegationElimination 2011

5
Pythonのログ記録のドキュメントは のための最高のユースケースは言うprintコマンドラインアプリケーションでのユーザーのためのヘルプメッセージを表示することです。
slushy 2015年

これらすべての答えを読んで、私は逆の質問をしたいと思います:ロギングを使用しない理由はありますか?
information_interchange

回答:


104

ロギングパッケージには多くの便利な機能があります。

  • ロギング呼び出しがどこからいつ(どの行番号でも)行われているのかを簡単に確認できます。
  • ファイル、ソケット、ほとんど何でも、すべて同時にログに記録できます。
  • 重大度に基づいてログを区別できます。

印刷にはこれらのいずれもありません。

また、プロジェクトが他のPythonツールによってインポートされることを意図している場合、ユーザーは印刷メッセージの送信元を知らない可能性があるため、パッケージが標準出力に出力することはお勧めできません。ロギングを使用すると、パッケージのユーザーは、ツールからロギングメッセージを伝達するかどうかを選択できます。


2
非常によく言いました。一度だけ実行する予定の使い捨てスクリプトをデバッグするときにprintを使用することがありますが、他の人間の目で見られるコードや1日以上続くコードはすべてロガーになります。
TimothyAWiseman 2011

23

適切なロギングの最大の利点の1つは、メッセージを分類し、必要に応じてメッセージをオンまたはオフにできることです。たとえば、プロジェクトの特定の部分でデバッグレベルのメッセージをオンにし、他の部分ではトーンダウンして、情報過多に引き継がれないようにし、必要なタスクに簡単に集中できるようにすると便利な場合があります。ロギング。

また、ログは構成可能です。それらを簡単にフィルタリングし、ファイルに送信し、フォーマットし、タイムスタンプを追加し、その他グローバルベースで必要になる可能性のあるものを追加できます。印刷ステートメントは簡単に管理できません。


3
ファイルに出力を送信する場合は間違いなく+1です。事後分析でログファイルを解析する方が、開いているコンソールウィンドウでログファイルを再度壊してエラーを見つけるよりもはるかに優れています。基本的に、ロガーは、スクリプトが失敗している間ではなく、失敗した後にスクリプトをデバッグする必要がある場合に理想的です。また、プログラム出力の分析が必要な複雑な問題をデバッグする必要がある場合にも理想的です。基本的に、構文エラーよりも複雑なエラーを処理するときはいつでも、ロガーはおそらくそれを単純化します。
Jonathanb

11

印刷ステートメントは、オンラインデバッガーのマイナス面と診断機器を組み合わせた、両方の世界最悪の種類です。プログラム変更する必要がありますが、それ以上の便利なコードは取得できません。

オンラインデバッガーを使用すると、実行中のプログラムの状態を検査できます。しかし、実際のデバッガーの良いところは、ソースを変更する必要がないことです。デバッグセッションの前でも後でもありません。プログラムをデバッガーにロードし、どこを見たいかをデバッガーに指示するだけで、準備は完了です。

アプリケーションのインストルメンテーションには、ソースコードを何らかの方法で変更するために、事前に作業が必要になる場合がありますが、結果の診断出力には非常に多くの詳細が含まれる可能性があり、非常に特定の程度でオンまたはオフにすることができます。Pythonロギングモジュールは、ログに記録されたメッセージだけでなく、それを呼び出したファイルと関数、存在する場合はトレースバック、メッセージが実際に送信された時刻なども表示できます。それ以上; 診断機器を取り外す必要ありません。これは、プログラムが終了し、本番環境で追加された日と同じように有効で便利です。ただし、出力がログファイルに残っている可能性があり、誰も迷惑をかけない可能性があります。または、ログレベルを下げて、最も緊急のメッセージを除くすべてを除外することもできます。

デバッガーの必要性や使用法を予測することは、テスト中にipythonを使用し、組み込みのpdbデバッガーを制御するために使用するコマンドに精通することほど難しくありません。

印刷ステートメントはpdbを使用するよりも簡単かもしれないと思うとき(よくあることですが)、ロガーを使用すると、印刷ステートメントを使用して後で削除する場合よりも、プログラムがはるかに簡単に状態で作業できるようになります。 。

私のエディターは、printステートメントを構文エラーとして強調表示し、loggingステートメントをコメントとして強調表示するように構成しています


4

ロギングを使用する場合、デプロイメントの責任者は、カスタム情報を使用してロガーをカスタムの場所に送信するようにロガーを構成できます。印刷するだけなら、それだけです。


1

ロギングは基本的に、他のメタデータ(タイムスタンプ、ログレベル、行番号、プロセスなど)を含む印刷出力の検索可能なプレーンテキストデータベースを作成します。

これは純金です。Pythonスクリプトの実行後にログファイルに対してegrepを実行できます。egrepパターン検索を調整して、興味のあるものを正確に選択し、残りを無視することができます。この認知的負荷の軽減と、後で試行錯誤によってegrepパターンを選択する自由は、私にとって重要な利点です。

tail -f mylogfile.log | egrep "key_word1|key_word2"

ここで、印刷では実行できない他の優れた機能(ソケットへの送信、デバッグレベルの設定、ログローテーション、メタデータの追加など)を投入します。プレーンな印刷ステートメントよりもログを優先する理由があります。

怠惰で簡単なため、printステートメントを使用する傾向があります。ロギングを追加するには、ボイラープレートコードが必要です。yasnippets(emacs)やultisnips(vim)などのテンプレートツールがあるので、プレーンなprintステートメントのロギングをあきらめるのはなぜですか。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.