- 締切済み
【Python】ロギングとは? 初学者です
Pythonを独学で1から勉強している初学者です。 【ロギング】という手法について質問します。 ◉ロギングについてわかっていること: ・どういう処理が行われたか、どういうエラーが起きたかなどのログを取る行為 ・ログの種類、重要度に応じて5つのレベルが設定されている ◉分からないこと 例えば、以下のようにコードを書いたとします。 ---------- import logging logging.warning('warning') ---------- すると、次のような出力になります。 ---------- WARNING:root:warning ---------- print関数のような、非常に単純な入力に対する出力にしか見えないのですが、この場合、内部ではどのような処理が起きるのでしょうか? 例えば、実際にwarningクラスに当たるようなインシデントがプログラム内で起きていた場合、 上記のロギングはどのように動作し、ユーザ(プログラムを書いている側)には、「どこで何が起こって、なぜwarningが出たのか」がどのように分かる仕組みなのでしょうか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- m-take0220
- ベストアンサー率60% (477/782)
loggingでは、出力するlevelを指定することができるので、開発中はinfoやwarningも出力するけど、運用時はerror以上しか出力しない、といったことができます。 また、例外処理の中でexceptionを使用すると、ログファイルにトレースバックが記録できるので、どんな例外が発生したのか確認できます。 細かい話では、"ERROR"などの表記が人によって変わらない("Error"だったり"error"だったりしない)ので、ログファイルの監視がやりやすいということもあります。
- asciiz
- ベストアンサー率70% (6803/9674)
やりたいことは、printデバッグと一緒と思っていいです。 例えば、 if a==b: ____等しいときの処理 elsif a>b: ____aが大きいときの処理 else: ____ここはあり得ないはず… こんな部分があったとしましょう。 elseに分岐するはずはないけど、万が一分岐してしまったときのために else: ____print('a<bになることは無いはず?') なんてprint文を書いて、あり得ない事態に対してエラー表示を出す、ということが考えられます。 しかし、その処理の前後で通常の処理出力を print しているのに、いきなりエラー表示が混じるのは都合悪い場合があります。 そんな時に、logging.warning() によって、エラー表示専用(エラーじゃなくてもいいですけど)に出力しておくことにより、画面出力を乱さずにログファイルに記録できる、といった利用法ができます。 warningやerrorとして出力するメッセージは、単に「エラー」という文言ではどこで何が起こったものかわかりませんので、メッセージ自体に場所や原因を含ませるように書きましょう。 例えば上記の例なら、 ____logging.warning('関数aaa: a<bになることは無いはず?') とか、 ____logging.warning('関数aaa: a<bになることは無いはず? a=%d b=%d', a, b) みたいに、どこで起こったものか(関数aaa)、なんでエラーになったか(a, bの値) を出力しておくと、原因に思い当たったりするかもしれません。 ----つまり---- >「どこで何が起こって、なぜwarningが出たのか」がどのように分かる仕組みなのでしょうか? 「自分でログにわかるように書きだすから、わかる」という話なので、warning出力したら自動的にどこで何が起こったのか判別できるようなものが出力されるわけではありません。
お礼
お礼が遅くなりすみません。 非常に丁寧なご回答をいただき、loggingの使い道が何となく想像できるようになりました!(実践の機会があれば、なお良いのですが…笑) エラーだけをログファイルにまとめたり、エラーなどのメッセージを設定したりすることで、デバッグの際に分かりやすくできるのですね。 ありがとうございました!
お礼
お礼が遅くなりすみません。 まだ実用的な場面でPythonを使いこなすことができないので、完全に把握できたわけではありませんが、エラー出力のレベルを制限できたり、エラーだけを確認するのに使うわけですね。表記が統一されるため分かりやすい、というのも納得しました。ご回答ありがとうございました!