Flaskのログレベル(DEBUG/INFO/WARNING/ERROR)を使い分ける方法を完全ガイド!
生徒
「Flaskでログを出し始めたのですが、何でもかんでも記録すると画面が文字だらけになって、何が重要なのか分からなくなっちゃいました……。」
先生
「それは『ログレベル』を使い分けるタイミングですね。情報の重要度に合わせてラベルを貼ることで、必要な情報だけを効率よく確認できるようになるんですよ。」
生徒
「ラベルですか!具体的にどんな種類があって、どうやって使い分ければいいんですか?」
先生
「DEBUGやINFOといった5つの段階があります。初心者の方でもすぐに実践できる使い分けの基準を、これから詳しく解説しますね!」
1. ログレベルとは?情報の「重要度」を決めるルール
プログラミング未経験の方が「ログレベル」と聞くと難しく感じるかもしれませんが、これは日常生活における「情報の伝え方」と同じです。例えば、家族に「今日はパンを買ったよ」と伝えるのと、「火事だ!逃げろ!」と伝えるのでは、緊急性も重要度も全く違いますよね。
Webアプリ開発フレームワークであるFlaskにおいても、アプリが動いているときに出すメッセージ(ログ)に「これは単なる独り言(DEBUG)」「これは日常の報告(INFO)」「これは一大事(ERROR)」という風に、ランク付けをすることができます。このランクのことをログレベルと呼び、適切に設定することで、アプリの健康状態を把握しやすくする「可観測性(オブザーバビリティ)」を向上させることができます。
2. ログレベルの5段階とそれぞれの役割
PythonやFlaskでは、標準的に以下の5つのレベルが使われます。下に行くほど重要度が高くなります。
| レベル名 | 緊急度 | 主な使いどころ |
|---|---|---|
| DEBUG | 低 | 開発中の細かい計算過程や変数の確認など。 |
| INFO | 中低 | 「ページが開かれた」「ログインした」などの正常な動作記録。 |
| WARNING | 中 | 「今のところ動いているけど、何かおかしいかも?」という警告。 |
| ERROR | 高 | 「処理が失敗した」など、明確な不具合が起きたとき。 |
| CRITICAL | 最高 | 「アプリが完全に止まった」など、致命的なトラブル。 |
3. DEBUGレベル:開発者だけが知りたい「楽屋裏」の情報
DEBUG(デバッグ)レベルは、プログラミング中の「試行錯誤」の記録に使います。例えば、「この変数の中身は今どうなっているかな?」とか「この条件分岐のどっちを通ったかな?」といった、非常に細かくて個人的なメモのようなものです。
このログは、アプリが完成して一般の人に公開されるときには非表示にするのが一般的です。なぜなら、楽屋裏の情報が多すぎると、後で説明する「本当に大事な情報」が埋もれてしまうからです。パソコンを触ったことがない方も、まずは「作業用のメモ書き」とイメージしておきましょう。
@app.route('/calculate')
def calculate():
x = 10
y = 20
result = x + y
# 計算の途中の細かい値を記録する
app.logger.debug(f'計算開始: x={x}, y={y}')
return f'合計は {result} です'
4. INFOレベル:アプリの「健康診断」のための日常記録
INFO(インフォ)レベルは、アプリが正しく動いていることを確認するための日常的な報告です。お店で例えるなら「お客様が1人来店されました」「レジを1回打ちました」といった、普通の出来事です。
INFOログを適切に残しておくと、後から「今日は何回アクセスがあったかな?」「何時に人気が集中したかな?」といった分析ができるようになります。エラーではないけれど、記録しておくと後で役に立つ。そんな情報をこのレベルで出力します。
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
# 誰かがログインを試みたことを記録する
app.logger.info(f'ユーザー {username} がログインを試みました')
return 'ログインチェック中...'
5. WARNINGレベル:「火の用心」を呼びかける注意喚起
WARNING(ワーニング)は、今のところアプリは動いているけれど、放置すると将来的に問題になりそうなときに使います。「この設定は古いので、近いうちに使えなくなりますよ」とか「サーバーのメモリが少し不足気味です」といった、黄色信号のような役割です。
初心者の方は、「エラーではないけれど、プログラマーとして少し気になること」があったらこのレベルを使うと覚えておきましょう。警告を無視せずに対応することで、大きなトラブルを未然に防ぐことができます。
@app.route('/upload')
def upload_file():
# 容量が少し大きい場合などに注意を促す
file_size = 80 # 単位はMBと想定
if file_size > 50:
app.logger.warning(f'大きなファイル({file_size}MB)がアップロードされようとしています。')
return 'アップロード受付'
6. ERRORレベル:すぐに修理が必要な「故障」の合図
ERROR(エラー)は、プログラムの処理が途中で失敗し、ユーザーに正しい結果を返せなかったときに使います。「データベースに接続できなかった」「計算式が間違っていて答えが出せなかった」などの場面です。
このレベルのログが出たときは、プログラマーがすぐに原因を突き止めて修理する必要があります。エラーログには、後で解説する「traceback(トレースバック)」などの詳細情報を一緒に含めることで、どこを直すべきかが分かりやすくなります。SEO対策としても、「エラーログ 管理」といった言葉は非常に重要です。
@app.route('/profile/<user_id>')
def get_profile(user_id):
try:
# 存在しないデータを取得しようとして失敗する場合
user = find_user_in_db(user_id)
except Exception as e:
# 明確な失敗を記録する
app.logger.error(f'ユーザー情報の取得に失敗しました。ID: {user_id}, 原因: {e}')
return 'エラーが発生しました', 500
7. ログレベルの設定方法:どのレベルまで表示するかを決める
Flaskでは、アプリ全体で「どのランク以上のログを画面(またはファイル)に出すか」を設定できます。これを閾値(しきいち)の設定と言います。例えば、設定を「INFO」にすると、INFO、WARNING、ERROR、CRITICALは表示されますが、それより重要度が低いDEBUGは表示されなくなります。
開発中はDEBUGに設定して何でも見えるようにし、本番環境(実際に一般公開する環境)ではINFOやWARNINGに設定して、画面が余計な文字で埋まらないようにするのがプロの現場での鉄則です。
import logging
from flask import Flask
app = Flask(__name__)
# ログレベルを「INFO」に設定する
# これにより、DEBUGログは無視されるようになります
app.logger.setLevel(logging.INFO)
@app.route('/')
def home():
app.logger.debug('これは表示されません')
app.logger.info('これは表示されます!')
return 'ログ設定のテスト中'
8. 実践!初心者がログレベルを使い分けるための3つのステップ
最後に、今日から使える使い分けのコツを整理します。
- まずはINFOから: ページにアクセスがあったときなど、主な動きに
app.logger.info()を入れてみましょう。 - エラーが起きたらERROR: プログラムが止まってしまった場所や、
exceptでエラーを捕まえた場所には必ずapp.logger.error()を入れます。 - 迷ったらDEBUG: 「これは記録しておきたいけど、後で消すかも」と思う情報は、とりあえず
app.logger.debug()にしておけば間違いありません。
9. ログレベルを活用してトラブルに強いエンジニアへ
ログレベルの使い分けは、単なるプログラミングのテクニックではなく、アプリを利用するユーザーへの思いやりでもあります。適切に記録されていれば、トラブルが起きても迅速に対応できるからです。パソコンの操作に自信がない方も、まずは「情報の重要度を仕分ける」という意識を持つだけで、立派な一歩を踏み出しています。
Flaskのログ機能をマスターして、どんな時でも慌てずにアプリの状態を把握できる、頼もしい開発者を目指していきましょう。日々のログの積み重ねが、あなたのアプリをより強く、より安全なものへと育ててくれます。