Flask学習|ログ出力の基本とapp.loggerの活用法を学ぼう【チャプター6-04】

一つ前のページではカスタムエラーページについて学習しました。
今回は ログ出力によるデバッグ について見ていきましょう。
Chapter1:Flask入門編
Chapter2:Jinja2入門編
Chapter3:フィルター編
Chapter4:フォーム編
Chapter5:データベース編
Chapter6:エラーハンドリングとデバッグ編
・Chapter6-1:Flaskでよくあるエラー集と対処法
・Chapter6-2:エラーハンドリングの基本
・Chapter6-3:カスタムエラーページを作ろう
・Chapter6-4:ログを出力してデバッグしよう ◁今回はここ
・Chapter6-5:デバッグモードを活用しよう
・Chapter6-6:Flask-DebugToolbarを使おう
Chapter7:アプリ開発編
Pythonを学び始めた多くの人が、コードの動作確認やエラー調査にprint()
関数を使います。
これはシンプルで直感的な方法ですが、FlaskによるWebアプリケーションを開発する段階になると、その限界が見えてきます。
たとえばアプリを本番環境で動かすとき、どこで何が起きたかを知るために画面に出力されない情報を記録しておく必要があります。
また単なる出力ではなく、「これはデバッグ情報」「これはエラー」といった分類を行うことで、後から問題の原因を効率よく特定できるようになります。
そこで登場するのが、Python標準ライブラリである logging
モジュールです。この記事では、次のような内容を学んでいきます。
logging
モジュールの役割と利点logging.basicConfig()
を使った設定方法debug()
やerror()
など、ログ出力レベルの意味と使い分け- Flaskにおける
app.logger
の使い方 - ログをファイルに出力する方法とその活用例
これらをマスターすれば、本番環境でも安心して使えるデバッグ手法が身につき、print()のみに頼る段階から一歩成長できます。
本記事は 有料記事(100円)ですが、現在は期間限定で無料公開中です。
Pythonのloggingモジュール入門|ログ出力の基本概念を学ぼう
logging
モジュールは、Pythonに標準で搭載されているログ出力専用の仕組みです。
これはプログラムの実行中に起きた出来事(イベント)を、あらかじめ決めた形式で記録するためのツールです。
たとえば次のような用途で使われます。
- 開発中に特定の関数が呼び出されたかを記録する
- 実行時にエラーや警告が発生した箇所を追跡する
- 本番環境でユーザーから報告された不具合の原因を突き止める
print()
との最大の違いは、情報の種類を分類(ログレベル)できる点にあります。
単にメッセージを表示するだけでなく、
- 「これはデバッグ用の出力だ」
- 「これは重大なエラーなので記録しておく必要がある」
といったように、ログの重要度を設定できます。
また、logging
モジュールは次のような柔軟性も備えています。
- 画面だけでなくファイルや外部サービスに出力可能
- 出力の書式を自由に設定可能
- フィルターで出力対象を制限できる
これらの特長により、シンプルなスクリプトから大規模なWebアプリケーションまで幅広く対応できる仕組みとなっています。
logging.basicConfigでログ設定をしよう
ログ出力を行うためには、まずlogging
モジュールを初期化する必要があります。
そのための基本的な構文が次のbasicConfig()
関数です。
logging初期設定の基本構文
import logging # loggingモジュールのインポート logging.basicConfig(level=ログレベル)
この構文の意味は次のとおりです:
import logging
: loggingモジュールをインポートします(標準ライブラリなので追加インストール不要)basicConfig(...)
: ログの出力形式や出力先、ログレベル などの基本設定を行います
ログレベルの種類と重要度の違い
ログレベル | 説明 |
---|---|
DEBUG | デバッグ用の詳細な情報(開発中向け) |
INFO | 正常動作の情報(処理開始・完了など) |
WARNING | 注意すべき事象(今は動くが将来危険) |
ERROR | 処理中に発生したエラー |
CRITICAL | システムに致命的なエラー |
basicConfig()
を使えば、これらのレベルをフィルタリングして出力対象を制御できます。
たとえば level=logging.INFO
とすれば、INFO以上のログ(INFO, WARNING, ERROR, CRITICAL)が出力されます。
よく使われるloggingの設定例
logging.basicConfig( level=logging.DEBUG, # どのレベルのログを出力するか format='%(asctime)s [%(levelname)s] %(message)s' # ログの出力形式 )
この設定により、ログ出力は次のような形式になります:
2025-05-28 12:34:56,789 [DEBUG] デバッグ用のメッセージです
ログ出力例と各ログレベルの使い方
次に、実際にログを出力する関数の使い方を紹介します。
ログの出力は非常にシンプルで、以下の関数を呼ぶだけです:
logging.debug("デバッグ情報") logging.info("通常の情報") logging.warning("警告メッセージ") logging.error("エラーメッセージ") logging.critical("致命的なエラー")
それぞれの関数はログレベルに対応しており、出力の優先順位が違います。
ログ出力コードと実行例の解説
import logging # ログの初期設定 logging.basicConfig( level=logging.DEBUG, # DEBUG以上のログをすべて出力 format='%(asctime)s [%(levelname)s] %(message)s' ) # それぞれのログレベルで出力してみる logging.debug("変数xの中身は42です") # 主に開発者向けの詳細情報 logging.info("プログラムが正常に開始されました") # ユーザー向けの通常の動作メッセージ logging.warning("ファイルが見つかりませんでした。デフォルト設定を使用します") # 今後問題になるかもしれない情報 logging.error("データベースへの接続に失敗しました") # 明確なエラー logging.critical("システムが応答していません") # すぐに対応が必要な深刻な状況
このコードはログの各レベルがどのような意味を持ち、どのように使い分けるべきかを示しています。
Flaskでloggingを使いこなす方法
Pythonのlogging
はFlaskにも組み込まれており、Flaskアプリケーションでは app.logger
という専用のログ出力手段が利用できます。
これにより、Flaskのルーティングや処理の流れの中で自然にログを記録することができます。
Flaskのapp.loggerの基本
from flask import Flask app = Flask(__name__) @app.route('/') # ルーティング(もしこのURLにアクセスされたら) def index(): app.logger.debug("トップページにアクセスされました") # debug()メソッドでログを残す return "Hello Flask"
app.logger
は、Flaskが内部的に用意しているロガーです。- Pythonの
logging
と同じく、debug()
、info()
、warning()
、error()
、critical()
が使用可能です。 - Flaskでは、アプリケーションの動作をログに記録することで問題発生時に処理の流れを追跡できます。
Flaskでのエラーログ記録例
@app.route('/divide') # ルーティング(もしこのURLにアクセスされたら) def divide(): try: # 例外処理の開始 result = 10 / 0 # ゼロ除算エラーを発生させる except ZeroDivisionError as e: # ゼロ除算エラーが発生した場合の処理を定義(eはエラー内容) app.logger.error(f"エラー発生: {e}") # error()メソッドで、エラーレベルのログを残す return "エラーが発生しました" return f"結果: {result}"
- Webアプリでは、画面にエラーを出す代わりにログに記録しておくのが原則です。
app.logger
は、printではできない本番環境での問題追跡にとても有効です。
ログをファイル出力する方法
標準では、ログは画面(標準出力)に表示されますが、ログをファイルに保存することも非常に重要です。
特に本番環境では、エラー発生の履歴を記録するためにファイル出力が基本となります。
ログをファイル保存する基本構文
import logging logging.basicConfig( # ログ出力の基本設定を行う level=logging.DEBUG, # DEBUGレベル以上のすべてのログ(DEBUG, INFO, WARNING, ERROR, CRITICAL)を出力対象にする filename='app.log', # 出力先ファイル名 filemode='a', # 'w'で上書き、'a'で追記 format='%(asctime)s [%(levelname)s] %(message)s' # ログの出力フォーマットを指定:日時・レベル・メッセージを含める )
この設定により、ログは画面には表示されず、指定したファイル(この場合は app.log
)に記録されます。
Flaskアプリでのファイル出力例
Flaskのapp.logger
も実際にはPythonのlogging
を使っているため、以下のように初期化しておくと、Flask内のログもファイルに保存されます。
import logging from flask import Flask logging.basicConfig( # ログ出力の基本設定を行う(Flaskアプリ全体に影響する) level=logging.DEBUG, # DEBUGレベル以上のログ(DEBUG, INFO, WARNING, ERROR, CRITICAL)をすべて出力する filename='flask_app.log', # 出力先のログファイル名を指定(このファイルにログが記録される) format='%(asctime)s [%(levelname)s] %(message)s' # ログの出力形式を指定:日時・レベル・メッセージを含む ) app = Flask(__name__)
このように、本番環境での運用にはファイルログの活用が欠かせません。
複数のログファイルを使ったり、ログのローテーション(自動保存)も可能ですが、それはより高度な運用で扱います。
まとめ
この記事では、Flaskアプリの開発において欠かせないログ出力によるデバッグ手法を学びました。
print関数に頼るだけでは見えなかった情報を、記録として残し、整理し、レベル分けして扱えるようになることで、開発の質と効率を大きく向上させることができます。
開発の初期段階ではprint()
でも十分かもしれませんが、本格的なアプリ開発を目指すならログ出力は欠かせないスキルです。
特にFlaskのようなWebアプリケーションでは、ログが「エラーの探偵道具」となります。
一歩ずつ理解を深めながら、ツールの力を借りて効率的でスマートな開発者を目指しましょう。
FAQ|Flaskのログ出力とlogging活用
- Q1. Flaskでprint()とloggingはどう使い分ければ良いですか?
-
print()は開発初期の動作確認には便利ですが、本番環境ではloggingを使うべきです。loggingはログレベルや出力形式を管理でき、問題の追跡や保守に役立ちます。
- Q2. app.loggerを使うときに特別な設定は必要ですか?
-
基本的にはFlaskの初期設定だけで使用可能です。ただしログの出力先やレベルを調整するには、logging.basicConfigなどで設定を明示的に指定すると便利です。
- Q3. ログ出力が動作しないときに確認すべきポイントは?
-
loggingのレベル設定(例:DEBUG)と対象コードのログ関数のレベル(例:info, warningなど)が合っているかを確認してください。また、出力先の指定ミス(ファイル名など)もよくある原因です。