サーバー側で発生したエラーの詳細をログに書き出す方法について、少々お伺いしたいです。
例えば、未定義の変数を参照していた場合などに、何行目でエラーが起きているかなどログファイルへ出力させたいと考えております。
こちらの記事など読んでいて、logger.log(20, 'info')
などを記述し、出力したいログを出力する方法は分かったのですが、実際に変数の参照エラーなどが発生した際に、その内容を出力させる方法が分からない状況です。
どなたか、こちらの問題につきまして、解決する方法を探している為、ご助言頂けましたら幸いです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
実際に変数の参照エラーなどが発生した際に、その内容を出力させる方法が分からない状況です。
エラーが発生した場合、例外が送出されるので、ログを出力させたい場所で try - except
文で例外を捕捉し、エラー内容を出力すればいいとおもいます。
スタックトレースは traceback モジュールで取得できるので、必要な情報を適宜整形してログに出力すればいいとおもいます。
import logging
import traceback
def func():
print(x) # x は未定義
try:
func()
except Exception as e:
msg = traceback.format_exc()
logging.error(msg)
追記
こちらは、例外が発生した際に、except文をいくつか書いていた場合に、上のexcept文の処理が実行されるといった解釈で良かったでしょうか...?
例えば、main() から func1() を呼び出し、func1() から func2() を呼び出しているとして、func2() 内で例外が発生したとします。
その場合、例外は func2() -> func1() -> main() と except で捕捉されるまで呼び出しもとに再送出されていくので、一番上位側 (この場合 main()) に try~except を入れておけばよいという意味です。
def func2():
raise Exception("Error")
def func1():
func2()
def main():
try:
func1()
except Exception as e:
print(e)
main()
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.21%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/12/15 15:49
例えばなのですが、サーバー上で処理が止まってしまっている状況で、どこでエラーが起きているか分からない場合などでも、全体的に、try-except文で囲ってエラーを出力させる形になりますでしょうか?
2020/12/15 15:58 編集
Linux であれば、コードを弄るのではなく、python sample.py &> log.txt のように標準出力、標準エラー出力をファイルに書き出すようにしてスクリプトを起動すればいいのではないでしょうか
2020/12/15 16:10 編集
はい。つい先日こちらのケースが起きてしまいまして、コードを最初から追いかけなくてはならず、少々苦労したことがあった為、こちらの問題を解決出来たらと考えております。
>Linux であれば、コードを弄るのではなく、python sample.py &> log.txt のように標準出力、標準エラー出力をファイルに書き出すようにしてスクリプトを起動すればいいのではないでしょうか
こちらですが、具体的には「 https://teratail.com/questions/310248 」前回の質問で詳しく記載させて頂いておりました。
簡単にご説明しますと、LINEボットの開発なのですが、「python sample.py 」こちらのような形での検証が出来ない為、どうすれば良いか解決策を模索しているといった状況でした。
2020/12/15 16:17 編集
try ~ except は try 節内で発生した例外は捕捉可能なので、上位側にこれを仕込んでおけばいいです。
2020/12/15 16:22
こちらですが、そうなりますとコード全体をtry-exceptのtryブロックに入れ込むといった解釈で合っていますでしょうか...?
2020/12/15 16:27 編集
https://docs.python.org/ja/3/library/exceptions.html
https://python.keicode.com/lang/python-exception-handling.php
> そうなりますとコード全体をtry-exceptのtryブロックに入れ込むといった解釈で合っていますでしょうか...?
それであっています。例外が発生した場合、捕捉されるまでどんどん上位に投げられるので、一番上位の部分に try~except を入れておけばよいです。
2020/12/15 16:50
ご返信頂きありがとうございます。
>例外が発生した場合、捕捉されるまでどんどん上位に投げられるので
こちらは、例外が発生した際に、except文をいくつか書いていた場合に、上のexcept文の処理が実行されるといった解釈で良かったでしょうか...?
>それであっています。例外が発生した場合、捕捉されるまでどんどん上位に投げられるので、一番上位の部分に try~except を入れておけばよいです。
ありがとうございます。
早速、try-except文を使用し、エラーの出力がなされるか検証してみたいと思います。
2020/12/15 16:58
そういう意味ではないです。
回答にコード例と説明を追加しました。
これでわかりますでしょうか?
2020/12/15 17:12
ご丁寧にご説明下さりましたおかげで、理解することが出来ました。
大変、勉強になりました。
度々のご質問にも関わらず、ご親切に教えて下さりありがとうございました。
2021/02/23 20:53
現在Djangoでバックエンド側を開発しているのですが、本番環境でもスクリプトで問題があった際に、「try-except」で全体を囲って置けば何かエラーが発生した際にも便利ではないかと考えております。
しかし、自分は実務経験も少ないというのもあり、あまりそういったコードを見たことがなく、実際どうなのかが分からず正しいのかどうなのかが分からないといった状況なのですよね...
2021/02/23 20:55
2021/02/23 21:21
2021/02/23 21:37