カテゴリ: Flask 更新日: 2026/02/10

Flaskのログ管理でよくあるミスと改善ポイントまとめ!可観測性を高める秘訣

Flaskのログ管理でよくあるミスと改善ポイントまとめ
Flaskのログ管理でよくあるミスと改善ポイントまとめ

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

生徒

「Flaskでアプリを作ってみたのですが、エラーが起きた時に原因が全然わからなくて困っています。ログを見ればいいんですよね?」

先生

「その通りです。でも、ただログを出せば良いわけではありません。実は初心者が陥りやすい『ログの落とし穴』があるんですよ。」

生徒

「落とし穴ですか?どんなことに気をつければ、後から困らない『良いログ』が作れるようになりますか?」

先生

「よくある失敗例と、それをどう改善すれば『可観測性』が高まるのか、具体的に解説していきましょう!」

1. ログレベルを正しく使い分けられていない

1. ログレベルを正しく使い分けられていない
1. ログレベルを正しく使い分けられていない

プログラミング未経験の方が最初にやってしまいがちなのが、すべての記録を「print文」で画面に出してしまうことです。しかし、Flaskなどのシステム開発では、情報の重要度に応じて「ログレベル」というラベルを付けるのが基本です。

ログレベルには主に「DEBUG(デバッグ:開発中の細かいメモ)」「INFO(インフォ:通常の動作記録)」「WARNING(ワーニング:注意が必要な出来事)」「ERROR(エラー:問題発生)」などがあります。これらをすべて同じ扱いにすると、本当に大切な「エラー発生」の通知が、大量の「普通の記録」に埋もれて見つからなくなってしまいます。改善ポイントは、情報の重要度を一度立ち止まって考え、適切なレベルで記録することです。

2. 標準のprint関数だけで満足してしまう

2. 標準のprint関数だけで満足してしまう
2. 標準のprint関数だけで満足してしまう

「画面に文字が出ればいいから、printを使えばいいや」と思うかもしれません。しかし、print関数はあくまで「その場しのぎ」の表示です。本格的なアプリ運用では、ログはファイルに保存したり、日付や時間を自動で付けたりする必要があります。

Flaskでは、標準で用意されている app.logger を使うのが正解です。これを使うだけで、何時何分にその記録が作られたのか、どのプログラムから出力されたのかといった「証拠」としての価値が格段に上がります。以下のコードで、正しい書き方の基本を見てみましょう。


from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    # print("アクセスがありました") ではなく logger を使う!
    app.logger.info('トップページへのアクセスを正常に受け付けました')
    return 'こんにちは!ログの勉強中です。'

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

3. ログに必要な「文脈(コンテキスト)」が足りない

3. ログに必要な「文脈(コンテキスト)」が足りない
3. ログに必要な「文脈(コンテキスト)」が足りない

後からログを読み返して一番困るのが、「エラーが起きました」という一行だけの記録です。これでは、どのユーザーが、どの画面で、どんな入力をした時にエラーになったのかが全く分かりません。

このような「周囲の状況」のことを専門用語で「文脈(コンテキスト)」と呼びます。ログには必ず「誰が(ユーザーID)」「何をしようとしたか(URLや操作内容)」を含めるようにしましょう。改善のコツは、自分が未来の自分に宛てた「事件現場の報告書」を書いているつもりで、詳細を盛り込むことです。これにより、可観測性(システムの中身が手に取るようにわかる状態)が向上します。

4. 個人情報や機密情報をログに出してしまう

4. 個人情報や機密情報をログに出してしまう
4. 個人情報や機密情報をログに出してしまう

これはセキュリティ上の非常に大きなミスです。デバッグのために、ユーザーのパスワードやクレジットカード番号、住所などをそのままログに書き出してしまうことがあります。ログファイルは、サーバーの管理者が閲覧できる場所に保存されるため、そこに機密情報が載っていると、情報漏洩のリスクになります。

改善ポイントは、ログを出す前に「この情報は誰に見られても大丈夫か?」を確認することです。もし個人情報を出したい場合は、星伏せ(例:user_****)にするなどの工夫が必要です。以下のコードは、セキュリティを意識したログの例です。


from flask import Flask, request

app = Flask(__name__)

@app.route('/login', methods=['POST'])
def login():
    username = request.form.get('username')
    # パスワードを logger.info(password) と書くのは絶対にNG!
    app.logger.info(f'ユーザー名: {username} がログインを試みています。')
    return 'ログイン処理中...'

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

5. ログの保存場所と「ローテーション」の無視

5. ログの保存場所と「ローテーション」の無視
5. ログの保存場所と「ローテーション」の無視

パソコンのハードディスクには容量の限界があります。ログをずっと一つのファイルに書き込み続けると、ファイルサイズが数ギガバイトという巨大なものになり、最終的にはパソコンが動かなくなってしまいます(これをディスクフルと呼びます)。

これを防ぐための改善策が「ログローテーション」です。これは、一定のサイズになったり、一日が過ぎたりしたときに、古いログファイルを別の名前に変えて保存し、新しいファイルを作り直す仕組みです。また、古いログを自動で削除する設定も大切です。Flask(Python)にはこれらを自動で行う RotatingFileHandler という便利な道具が備わっています。

6. エラーの「詳細な原因(スタックトレース)」を捨ててしまう

6. エラーの「詳細な原因(スタックトレース)」を捨ててしまう
6. エラーの「詳細な原因(スタックトレース)」を捨ててしまう

エラーが起きたとき、プログラムは「どのファイルの何行目で、どんな種類の間違いがあったか」という詳細な情報を持っています。これを「スタックトレース」と呼びます。初心者のミスで多いのは、せっかくのエラーを自分で捕まえて(catch)、短いメッセージだけをログに残して詳細を消してしまうことです。

これでは原因調査ができません。改善ポイントは、エラーの「生の情報」をそのままログに流し込む設定にすることです。Flaskの app.logger.errorexc_info=True というオプションを付けるだけで、魔法のように詳細なエラーレポートが記録されます。


from flask import Flask
import logging

app = Flask(__name__)

@app.route('/bug')
def trigger_error():
    try:
        # わざとエラー(0での割り算)を起こします
        result = 1 / 0
    except Exception as e:
        # exc_info=True を付けることで、エラーの場所を詳しく記録できます
        app.logger.error('計算中に予期せぬエラーが発生しました', exc_info=True)
    return 'エラーを記録しました'

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

7. 日時の形式がバラバラで検索できない

7. 日時の形式がバラバラで検索できない
7. 日時の形式がバラバラで検索できない

ログには必ず日時が入りますが、この書き方が「2026/01/12」だったり「Jan 12, 2026」だったりとバラバラだと、後で「昨日の夜10時のログだけ見たい」と思ったときに検索が非常に困難になります。

改善ポイントは、国際的な基準である「ISO 8601」形式(例:2026-01-12 21:00:00)に統一することです。また、複数の地域で使われるアプリなら、時間の基準(タイムゾーン)を「UTC(世界標準時)」にするか、どこかに明記する必要があります。これにより、ログが整然とした「データベース」のような役割を果たすようになります。

8. ログを「人間」のためだけに書いている

8. ログを「人間」のためだけに書いている
8. ログを「人間」のためだけに書いている

最後は少し高度な改善ポイントですが、とても重要です。多くの人は「今日は天気が良いです」のような自然な文章でログを書きます。しかし、最近は人間ではなく「機械(AIや分析ツール)」がログを読み取って、自動でグラフにしたり異常を検知したりすることが増えています。

そのため、文章の中にデータを埋め込むのではなく、「構造化ログ(JSON形式など)」として出力するのが現代的な改善ポイントです。例えば、「ユーザーAがログイン」ではなく、「{"user": "A", "action": "login"}」という形式で出すと、機械が瞬時に集計できるようになります。可観測性を高めるための大きな一歩です。


from flask import Flask
import json

app = Flask(__name__)

@app.route('/order')
def order():
    # 構造化されたログの例(辞書形式で作ってJSONに変換)
    log_data = {
        "level": "INFO",
        "event": "purchase",
        "item_id": 999,
        "amount": 1500
    }
    app.logger.info(json.dumps(log_data))
    return '注文完了'

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

9. 監視と通知のバランスを考えていない

9. 監視と通知のバランスを考えていない
9. 監視と通知のバランスを考えていない

ログを完璧に取っていても、誰もそれを見ていなければ意味がありません。逆に、ちょっとした注意(WARNING)が出るたびにメールやスマホに通知が飛んでくるようにすると、今度は通知がうるさすぎて無視するようになってしまいます(これをアラート疲れと呼びます)。

改善ポイントは、「すぐに対応が必要な重大なエラー(ERROR)」だけを通知し、それ以外は「後で確認するための記録(INFO)」として蓄積しておくという「切り分け」をしっかり行うことです。Flaskのログ設定を見直して、通知の重要度を整理することで、開発者の心の平穏とアプリの安全を両立させることができます。

カテゴリの一覧へ
新着記事
New1
Flask
Flaskで非同期フォーム送信(Ajax POST)を実装する方法を解説!初心者でもわかるステップ解説
New2
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
New3
Python
PythonでMySQLに接続する方法!pymysqlの基本的な使い方
New4
Flask
FlaskのURLルールとは?ルーティングの基本と動的URLの作り方を解説
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.2
Java&Spring記事人気No2
Flask
Flaskでデータベースを使う基本!SQLAlchemyの導入方法をやさしく解説
No.3
Java&Spring記事人気No3
Python
Pythonでリストの要素を検索・取得する方法!index()やin演算子の活用法
No.4
Java&Spring記事人気No4
Python
Pythonプログラムの書き方を基礎から学ぼう!初心者が覚えるべき文法とは?
No.5
Java&Spring記事人気No5
Python
Pythonで仮想環境(venv)を作る方法!初心者向けに環境構築をステップ解説
No.6
Java&Spring記事人気No6
Python
Pythonのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.7
Java&Spring記事人気No7
Flask
Flaskアプリの環境変数をクラウドで安全に設定する方法!初心者のための完全ガイド
No.8
Java&Spring記事人気No8
Flask
Flaskでクラウド上のメッセージキュー(SQS/PubSub)を扱う完全ガイド!初心者向け解説