カテゴリ: Flask 更新日: 2026/01/28

Flaskでエラーログを分かりやすく記録!traceback活用の完全ガイド

Flaskでエラーログを分かりやすく記録する方法(traceback活用)
Flaskでエラーログを分かりやすく記録する方法(traceback活用)

先生と生徒の会話形式で理解しよう

生徒

「Flaskでアプリを作っているのですが、エラーが出たときに画面が真っ白になったり、『Internal Server Error』とだけ出たりして、何が原因かさっぱり分かりません…。」

先生

「それは大変ですね。実は、エラーの裏側には『traceback(トレースバック)』という、原因究明に役立つ詳細な地図が隠されているんですよ。」

生徒

「地図ですか?それをどうやってログに記録すれば、初心者でもエラーを直せるようになりますか?」

先生

「tracebackモジュールを使えば、どのファイルの何行目で失敗したかを自動で詳しく記録できます。具体的な方法を見ていきましょう!」

1. traceback(トレースバック)とは何?

1. traceback(トレースバック)とは何?
1. traceback(トレースバック)とは何?

プログラミング未経験の方が最も苦労するのが、エラーの解決です。エラーが起きたとき、パソコンの内部では「どの処理を順番に辿って、どこで力尽きたか」という記録が作成されます。この記録がtraceback(トレースバック)です。

例えば、あなたが料理を作っていて、最後に塩を入れようとしたら容器が空だったとします。このとき、「1.キッチンへ行く」「2.コンロをつける」「3.塩を振ろうとする(失敗!)」という手順の記録が残っていれば、どこで問題が起きたかすぐに分かりますよね。tracebackはこの「手順の足跡」を教えてくれる、魔法の診断書なのです。Flask開発において、この診断書をログに書き出すことは、可観測性(アプリの中身を把握しやすくすること)を高めるための基本中の基本です。

2. try-except文でエラーを捕まえる仕組み

2. try-except文でエラーを捕まえる仕組み
2. try-except文でエラーを捕まえる仕組み

エラーログを記録するためには、まずエラーが起きた瞬間に「捕まえる」必要があります。ここで使うのがtry-except(トライ・エクセプト)文です。

これは、「もし失敗しそうな処理があったら、とりあえずやってみる(try)。もし失敗(例外)が起きたら、代わりの処理をする(except)」という構文です。これを使わずにエラーが起きると、アプリは突然止まってしまいます。捕まえることで、止まる直前の詳細な情報をログに書き込むチャンスが得られるのです。


from flask import Flask

app = Flask(__name__)

@app.route('/calculate')
def calculate():
    try:
        # 0で割るという、絶対に失敗する処理
        number = 10 / 0
        return str(number)
    except Exception as e:
        # ここでエラーを捕まえる
        return f"エラーが起きたよ: {e}"

3. tracebackモジュールを導入して詳細を記録する

3. tracebackモジュールを導入して詳細を記録する
3. tracebackモジュールを導入して詳細を記録する

単純にエラーメッセージだけを表示しても、「何が起きたか」は分かりますが「どこで起きたか」までは分かりません。そこで、Python標準のtracebackモジュールを導入します。

このモジュールの format_exc() という機能を使うと、エラーの詳しい経緯を文字列(テキスト)として取得できます。これをFlaskの app.logger.error() に渡してあげるだけで、非常に親切なエラーログが完成します。


import traceback
from flask import Flask

app = Flask(__name__)

@app.route('/error-test')
def error_test():
    try:
        # 存在しないリストの要素にアクセスしようとする
        my_list = [1, 2, 3]
        print(my_list[100])
    except Exception:
        # traceback.format_exc() で詳細なエラー情報を取得
        error_details = traceback.format_exc()
        app.logger.error(f"深刻なエラーが発生しました:\n{error_details}")
        return "サーバー内でエラーが起きました。管理者に連絡してください。"

if __name__ == '__main__':
    app.run(debug=True)

4. コンソールで見える「エラーの地図」を読み解く

4. コンソールで見える「エラーの地図」を読み解く
4. コンソールで見える「エラーの地図」を読み解く

実際に上記のコードを実行すると、パソコンの黒い画面(コンソール)には以下のようなログが表示されます。これを読み解くコツを覚えましょう。


[ERROR] in app: 深刻なエラーが発生しました:
Traceback (most recent call last):
  File "app.py", line 11, in error_test
    print(my_list[100])
IndexError: list index out of range

ここには3つの重要な情報が書かれています。

  1. File "app.py", line 11: 「app.py」というファイルの「11行目」で問題が起きました。
  2. print(my_list[100]): 実際に失敗した命令文はこれです。
  3. IndexError: リストの範囲を超えたという、エラーの種類(名前)です。
この情報を頼りにすれば、パソコンを触ったことがない方でも、どの行を直せばいいのかが一目で分かるようになります。

5. アプリ全体のエラーを一括で捕まえる「errorhandler」

5. アプリ全体のエラーを一括で捕まえる「errorhandler」
5. アプリ全体のエラーを一括で捕まえる「errorhandler」

全てのページ(ルーティング)に try-except を書くのは非常に大変です。そこで、Flaskには @app.errorhandler という便利な仕組みがあります。

これを使えば、アプリのどこでエラーが起きても、自動的に一箇所でエラー内容をログに記録し、ユーザーに優しいメッセージを表示することができます。これを「集中管理」と呼びます。


import traceback
import logging
from flask import Flask

app = Flask(__name__)

# 500番エラー(サーバー内部エラー)が起きたら、この関数を動かす
@app.errorhandler(500)
def handle_500_error(e):
    error_info = traceback.format_exc()
    app.logger.error(f"システムエラー検知:\n{error_info}")
    return "申し訳ありません。システムで不具合が発生しました。", 500

@app.route('/divide-zero')
def divide_zero():
    # 意図的にエラーを起こす
    return str(1 / 0)

6. ログの可読性を高めるための工夫

6. ログの可読性を高めるための工夫
6. ログの可読性を高めるための工夫

ログはただ出力すれば良いわけではありません。「後から人間が読みやすいこと」が重要です。これを可読性と言います。例えば、エラーログの前に目立つように「ハイフン(-)」や「アスタリスク(*)」を入れて区切りを作ると、大量のログの中からエラーを見つけやすくなります。

また、エラーが発生した時の「URL」や「アクセスしてきたユーザーのID」などを一緒に記録することも可能です。そうすることで、「誰がどのページを見ているときにエラーが起きたか」という背景まで把握できるようになり、問題解決がさらに早まります。

7. 開発環境と本番環境でのエラー表示の使い分け

7. 開発環境と本番環境でのエラー表示の使い分け
7. 開発環境と本番環境でのエラー表示の使い分け

初心者がよくやってしまうミスに、本番(公開用)のサイトでエラーの詳細を表示してしまうことがあります。traceback の内容はプログラムの内部構造が丸見えになってしまうため、悪意のある人に狙われる原因になりかねません。

セキュリティを守るための鉄則は、「ログには詳細を書き、ユーザーの画面には最小限の情報だけを出す」ことです。Flaskの設定で debug=False にして、ログファイルにだけ traceback を記録するように設定しましょう。これにより、開発者は詳細を知ることができ、ユーザーは安全にサイトを利用できるという「両立」が可能になります。

8. 実際にエラーログを運用する際のアドバイス

8. 実際にエラーログを運用する際のアドバイス
8. 実際にエラーログを運用する際のアドバイス

ログを記録し始めたら、定期的にそのファイルを確認する癖をつけましょう。エラーは起きていないのが理想ですが、記録されたログは「アプリがあなたに送っているSOSサイン」です。パソコンに慣れていないうちは、エラーログを読むのが怖く感じるかもしれませんが、そこに書かれているのはただの「手順の間違い」に過ぎません。

traceback を活用して一つひとつのサインに応えていくことで、あなたのアプリはどんどん完成度の高いものになっていきます。この「エラーを捕まえて、記録し、改善する」というサイクルこそが、プログラミング上達の最短ルートなのです。

カテゴリの一覧へ
新着記事
New1
Flask
Flaskのログレベル(DEBUG/INFO/WARNING/ERROR)を使い分ける方法を完全ガイド!
New2
Python
Pythonのfrozensetとは?ミュータブルなsetとの違いをわかりやすく解説
New3
Python
Pythonでセットを活用してデータをフィルタリングする方法!初心者でもわかるセットの基本と使い方
New4
Python
Pythonの辞書操作まとめ!初心者が知っておくべき便利ワザ集
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonの文字列から一部を抽出する方法!スライスを使った基本的な切り出し方
No.2
Java&Spring記事人気No2
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.3
Java&Spring記事人気No3
Flask
FlaskアプリのSECRET_KEYの設定方法を完全ガイド!初心者でもわかるセキュリティ対策
No.4
Java&Spring記事人気No4
Django
Djangoモデル入門|初心者が最初に知るべきORMの基本操作
No.5
Java&Spring記事人気No5
Flask
Flaskで非同期処理を成功させるベストプラクティス集|初心者でも失敗しない考え方
No.6
Java&Spring記事人気No6
Python
Pythonのリストを分割する方法を完全ガイド!初心者でもわかるスライス・split・itertoolsの使い方
No.7
Java&Spring記事人気No7
Flask
Flaskでデータベースを使う基本!SQLAlchemyの導入方法をやさしく解説
No.8
Java&Spring記事人気No8
Flask
Flaskのログをファイルに保存する方法!初心者でもわかる設定手順を徹底解説