複雑なプロジェクトでの単純なデバッグの場合、印刷の代わりにPythonロガーを使用する理由はありますか?他のユースケースはどうですか?それぞれに受け入れられている最良のユースケースはありますか(特に、stdoutのみを探している場合)?
これは「ベストプラクティス」だといつも聞いていますが、その理由がわかりません。
複雑なプロジェクトでの単純なデバッグの場合、印刷の代わりにPythonロガーを使用する理由はありますか?他のユースケースはどうですか?それぞれに受け入れられている最良のユースケースはありますか(特に、stdoutのみを探している場合)?
これは「ベストプラクティス」だといつも聞いていますが、その理由がわかりません。
print
。
print
コマンドラインアプリケーションでのユーザーのためのヘルプメッセージを表示することです。
回答:
ロギングパッケージには多くの便利な機能があります。
印刷にはこれらのいずれもありません。
また、プロジェクトが他のPythonツールによってインポートされることを意図している場合、ユーザーは印刷メッセージの送信元を知らない可能性があるため、パッケージが標準出力に出力することはお勧めできません。ロギングを使用すると、パッケージのユーザーは、ツールからロギングメッセージを伝達するかどうかを選択できます。
適切なロギングの最大の利点の1つは、メッセージを分類し、必要に応じてメッセージをオンまたはオフにできることです。たとえば、プロジェクトの特定の部分でデバッグレベルのメッセージをオンにし、他の部分ではトーンダウンして、情報過多に引き継がれないようにし、必要なタスクに簡単に集中できるようにすると便利な場合があります。ロギング。
また、ログは構成可能です。それらを簡単にフィルタリングし、ファイルに送信し、フォーマットし、タイムスタンプを追加し、その他グローバルベースで必要になる可能性のあるものを追加できます。印刷ステートメントは簡単に管理できません。
印刷ステートメントは、オンラインデバッガーのマイナス面と診断機器を組み合わせた、両方の世界で最悪の種類です。プログラムを変更する必要がありますが、それ以上の便利なコードは取得できません。
オンラインデバッガーを使用すると、実行中のプログラムの状態を検査できます。しかし、実際のデバッガーの良いところは、ソースを変更する必要がないことです。デバッグセッションの前でも後でもありません。プログラムをデバッガーにロードし、どこを見たいかをデバッガーに指示するだけで、準備は完了です。
アプリケーションのインストルメンテーションには、ソースコードを何らかの方法で変更するために、事前に作業が必要になる場合がありますが、結果の診断出力には非常に多くの詳細が含まれる可能性があり、非常に特定の程度でオンまたはオフにすることができます。Pythonロギングモジュールは、ログに記録されたメッセージだけでなく、それを呼び出したファイルと関数、存在する場合はトレースバック、メッセージが実際に送信された時刻なども表示できます。それ以上; 診断機器を取り外す必要はありません。これは、プログラムが終了し、本番環境で追加された日と同じように有効で便利です。ただし、出力がログファイルに残っている可能性があり、誰も迷惑をかけない可能性があります。または、ログレベルを下げて、最も緊急のメッセージを除くすべてを除外することもできます。
デバッガーの必要性や使用法を予測することは、テスト中にipythonを使用し、組み込みのpdbデバッガーを制御するために使用するコマンドに精通することほど難しくありません。
印刷ステートメントはpdbを使用するよりも簡単かもしれないと思うとき(よくあることですが)、ロガーを使用すると、印刷ステートメントを使用して後で削除する場合よりも、プログラムがはるかに簡単に状態で作業できるようになります。 。
私のエディターは、printステートメントを構文エラーとして強調表示し、loggingステートメントをコメントとして強調表示するように構成しています。
ロギングを使用する場合、デプロイメントの責任者は、カスタム情報を使用してロガーをカスタムの場所に送信するようにロガーを構成できます。印刷するだけなら、それだけです。
ロギングは基本的に、他のメタデータ(タイムスタンプ、ログレベル、行番号、プロセスなど)を含む印刷出力の検索可能なプレーンテキストデータベースを作成します。
これは純金です。Pythonスクリプトの実行後にログファイルに対してegrepを実行できます。egrepパターン検索を調整して、興味のあるものを正確に選択し、残りを無視することができます。この認知的負荷の軽減と、後で試行錯誤によってegrepパターンを選択する自由は、私にとって重要な利点です。
tail -f mylogfile.log | egrep "key_word1|key_word2"
ここで、印刷では実行できない他の優れた機能(ソケットへの送信、デバッグレベルの設定、ログローテーション、メタデータの追加など)を投入します。プレーンな印刷ステートメントよりもログを優先する理由があります。
怠惰で簡単なため、printステートメントを使用する傾向があります。ロギングを追加するには、ボイラープレートコードが必要です。yasnippets(emacs)やultisnips(vim)などのテンプレートツールがあるので、プレーンなprintステートメントのロギングをあきらめるのはなぜですか。