質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

499閲覧

Python3 ロギングでのエラーの出力

person

総合スコア223

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/09/16 06:21

例えばPythonで
print()をprrint()と書き間違えた時、

Python

1$ python3 /Users/USER/Desktop/test.py 2Traceback (most recent call last): 3 File "/Users/USER/Desktop/test.py", line 1, in <module> 4 prrint("a") 5NameError: name 'prrint' is not defined

とエラー表示されますが、
loggingを使ってこれを表示することは可能ですか?

下のように書いた場合、どこでエラーが起こったのかは見当つきそうですが、なぜエラーが起こったのかはログからは判別が難しいので。

Python

1import logging 2import os 3import sys 4 5LEVEL = "DEBUG" 6 7LOG_DIR = os.path.dirname(sys.argv[0]) 8LOG_FILENAME = "programlog.log" 9LOG_FILE = LOG_DIR + "/" + LOG_FILENAME 10 11FORMAT = "%(asctime)s , %(message)s" 12 13logging.basicConfig(level=LEVEL, filename=LOG_FILE, format=FORMAT, datefmt="%Y/%m/%d %H:%M:%S") 14 15logging.debug("print()の前") 16 17prrint("a") # ここでエラーが起こる 18 19logging.debug("print()の後")

log

12020/09/16 15:20:00, print()の前

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2020/09/16 08:40

それはtryで捕捉してはいけないタイプのエラーです
person

2020/09/17 00:32 編集

strerrというのがあるそうですが、そちらの方がいいでしょうか? sys.stderr = open(fle, "a") ただこれだと prrint("") # rが1文字多い は検出できましたが print(""") # "が1文字多い は検出できませんでした。 (コンソール画面にエラーが表示され、stderr出力ファイルにはなにも出なかった。)
hentaiman

2020/09/17 03:31

そういう意味ではありません。 > prrint("") # rが1文字多い これが1文字多い間違い方をしているのは人間だけです。 なぜならprrintを定義して使う事も出来るからです 一般的にそういう名前の定義をする人がいるかどうかは関係ありません。 なので実行時にはただのプログラミングミスとして「未定義」としてエラー出力され正常動作しない状態が正解で、それを確認した時点で修正するべきものです。 try~exceptするのは飽くまで「実行するまで正常動作するか分からない」ものだけです。毎回必ずエラーになると分かっているものはtryせずに修正しましょう。
person

2020/09/17 04:09

print()のエラーはあくまで例ですので、実際のエラーはそうとは限りません。 あくまで自分がデバックしている時点でバグはなかったが、ユーザに使ってもらったときにバグが発生したときに情報を収集するためにエラーをファイルへ出力したいと考えています。
hentaiman

2020/09/17 04:24

どういう使われ方想像しているのか全く分からないけど、モジュールで提供したものを別に誰かに使ってもらってその記述が正しくない場合の事を考えていますか? そうだとしても記述ミスに対してなら既に言った内容と同じですが。 また、モジュール内で勝手にエラーをファイル出力する話をしているのだとしても、基本的にはバグの原因となるやり方なので無いですね
person

2020/09/18 01:14

そうですか。 ただ、エラーの原因が明確でないと修正することもできませんし、推測で修正しても根本的な解決にならないと思うので、いろいろ考えてみます。
guest

回答1

0

ベストアンサー

こんな感じで如何でしょうか

tracebackモジュールについては以下をご参照ください。
https://docs.python.org/3/library/traceback.html

python

1import logging 2import os 3import sys 4 5LEVEL = "DEBUG" 6 7#LOG_DIR = os.path.dirname(sys.argv[0]) 8LOG_DIR = '.' 9LOG_FILENAME = "programlog.log" 10LOG_FILE = LOG_DIR + "/" + LOG_FILENAME 11 12FORMAT = "%(asctime)s , %(message)s" 13 14logging.basicConfig(level=LEVEL, filename=LOG_FILE, format=FORMAT, datefmt="%Y/%m/%d %H:%M:%S") 15 16def main(): 17 logging.debug("print()の前") 18 prrint("a") # ここでエラーが起こる 19 logging.debug("print()の後") 20 21 22if __name__ == "__main__": 23 try: 24 main() 25 except Exception as e: 26 # traceback モジュールを使わないと不親切な出力しかできません(多分標準) 27 import traceback 28 traceback.print_exc() 29 logging.error(traceback.format_exc()) 30 # raise e

投稿2020/09/16 07:06

編集2020/09/16 07:08
YakumoSaki

総合スコア2027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2020/09/20 04:05

person様は「まだ回答を求めています」とのことですが、上記回答だと何が不足なのでしょうか?
person

2020/10/02 02:35

不足というよりは他の解決策があれば、それも参考にしたいため回答を求めていますとしました。 ただあまりなさそうなので、明らかに例外が発生しそうな部分はtracebackにて対応することにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問