Flaskでログを分けて管理!アクセスログとアプリログの分離方法を徹底解説
生徒
「Flaskのログを見ているのですが、アクセス記録と自分で書いたエラーの記録が混ざっていて、すごく見づらいです…。」
先生
「それは良い着眼点ですね!規模が大きくなると、何時に誰が来たかの『アクセスログ』と、アプリが正しく動いたかの『アプリログ』を別々のファイルに保存するのが一般的ですよ。」
生徒
「ファイルを分けることができるんですか?初心者でも簡単に設定できる方法を教えてください!」
先生
「もちろんです。Pythonの標準的な仕組みを使って、整理整頓されたログ管理の方法を学んでいきましょう!」
1. なぜログを分けて管理する必要があるの?
プログラミングを始めたばかりの頃は、一つの画面(コンソール)にすべての情報が出ていてもあまり気になりません。しかし、実際にインターネット上でアプリを公開すると、毎日何千、何万という人があなたのサイトを訪れます。その記録がすべて一つのファイルに書き込まれていたらどうなるでしょうか?
例えば、大事な「エラーの記録」を探したいのに、その周りが大量の「ページを開きました」という記録で埋め尽くされていたら、まるで砂漠の中から一本の針を探すような作業になってしまいます。これを防ぐために、あらかじめ「来客名簿(アクセスログ)」と「業務日誌(アプリログ)」を別のノートに書き分けるように設定しておくのです。これを「ログの分離」と呼び、アプリの健康状態を把握しやすくする「可観測性(オブザーバビリティ)」を高める重要なテクニックとなります。
2. アクセスログとアプリログの違いを知ろう
まずは、分けるべき二つのログがそれぞれどのような役割を持っているのかを整理しましょう。
- アクセスログ(Access Log): 外部から「誰が」「いつ」「どのページを」見たかという外向きの記録です。主にWebサーバー(Werkzeugなど)が出力します。
- アプリログ(Application Log): プログラムの中で「計算が成功した」「データベースへの保存に失敗した」といった、アプリ内部の動きを記録した内向きの記録です。
この二つを分けることで、ウェブサイトの訪問者数を知りたいときはアクセスログを、プログラムの不具合を直したいときはアプリログを見る、といった使い分けができるようになります。
3. Pythonのloggingモジュールによるファイル出力の基本
ログを特定のファイルに出力するには、Pythonに最初から入っているloggingという道具(モジュール)を使います。この中にあるFileHandler(ファイルハンドラー)という機能が、特定のノート(ファイル)に書き込みを行う役割を担います。
まずは、自分の書いたメッセージを特定のファイルに保存する一番シンプルな書き方を見てみましょう。
import logging
from flask import Flask
app = Flask(__name__)
# アプリ用のログを保存するファイルの設定
file_handler = logging.FileHandler('app_business.log')
# どのような形式で書くかを決める(時間、ログのレベル、内容)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
# Flaskのロガーにこの設定を追加する
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)
@app.route('/')
def hello():
app.logger.info('ホーム画面が実行されました。')
return 'ログを確認してね!'
4. アクセスログを制御する「Werkzeug」の設定
Flaskを動かしているとき、裏側では「Werkzeug(ヴェルクツォイク)」というエンジンが動いています。実は、あの「127.0.0.1 - - [日付] "GET / HTTP/1.1" 200 -」というお馴染みのアクセス記録は、このWerkzeugが出しています。
このアクセスログもファイルに保存したい場合は、werkzeugという名前のロガーを捕まえて、別のファイルに書き出すように設定してあげれば良いのです。パソコンを触ったことがない方でも、「特定の名前の記録係に、別のノートを渡す」というイメージを持てば大丈夫です。
import logging
from flask import Flask
app = Flask(__name__)
# アクセスログ用の記録係を取得
access_logger = logging.getLogger('werkzeug')
# アクセスログ専用のファイルを作る
access_handler = logging.FileHandler('access_history.log')
access_logger.addHandler(access_handler)
@app.route('/info')
def info():
return 'ここは情報ページです。アクセスログが記録されます。'
5. 二つのログを完全に分離する実践コード
それでは、アプリの動作ログとアクセスログを完全に別々のファイルへ保存する、完成形のプログラムを書いてみましょう。これを実行すると、同じフォルダ内に二つのテキストファイルが作成されるようになります。
import logging
from flask import Flask
app = Flask(__name__)
# 1. アプリログの設定(自分のプログラムの動きを記録)
app_handler = logging.FileHandler('app_internal.log')
app_handler.setFormatter(logging.Formatter('[アプリ] %(asctime)s %(message)s'))
app.logger.addHandler(app_handler)
app.logger.setLevel(logging.INFO)
# 2. アクセスログの設定(誰が来たかを記録)
access_log = logging.getLogger('werkzeug')
access_handler = logging.FileHandler('access_web.log')
access_handler.setFormatter(logging.Formatter('[アクセス] %(asctime)s %(message)s'))
access_log.addHandler(access_handler)
@app.route('/test')
def test():
app.logger.info('テスト機能が呼ばれました!')
return '二つのログファイルに書き込まれました。'
if __name__ == '__main__':
app.run(debug=False) # デバッグモードがオンだとログの動きが変わることがあります
6. ログファイルが巨大化するのを防ぐ「ローテーション」
ログをファイルに保存し続けると、いつかはパソコンの保存容量がいっぱいになってしまいます。これを防ぐために「ログローテーション」という仕組みがあります。これは、ファイルが一定の大きさになったら新しいファイルを作り、古いものを自動で捨てたり圧縮したりする「世代交代」のような仕組みです。
logging.handlers.RotatingFileHandlerを使うと、この管理が全自動になります。初心者の方は、まず「ずっと保存し続けるとパソコンが重くなるので、自動で入れ替える設定があるんだな」と覚えるだけで十分です。
from logging.handlers import RotatingFileHandler
# 最大10,000バイトのファイルを5個まで保持する設定
rotate_handler = RotatingFileHandler('auto_clean.log', maxBytes=10000, backupCount=5)
app.logger.addHandler(rotate_handler)
7. フォーマット(書き方)をカスタマイズして見やすくする
ログはただ記録すれば良いわけではありません。後で人間が読みやすいように、整理整頓された形で書き出すことが重要です。Pythonでは「何時、どのファイルで、何行目で、どんなエラーが出たか」を記号を使って自由に指定できます。
例えば、%(lineno)d と書くと、エラーが発生したプログラムの「行番号」を表示してくれます。これを設定しておけば、問題が起きた場所を一瞬で見つけ出すことができるようになります。プログラミングにおいて、エラー箇所の特定は一番時間がかかる作業なので、ここを工夫するのが「デキるプログラマー」への第一歩です。
8. 実際にログを確認するときのポイント
ログを分けたら、実際にファイルを開いてみましょう。メモ帳などのテキストエディタで開くことができます。アクセスログには自分のパソコンの住所である「IPアドレス」や、使っているブラウザの種類などが書かれています。アプリログには、自分がapp.logger.info()の中に書いたメッセージが表示されているはずです。
もしプログラムが動かなくなったら、まずはアプリログの最後の方を確認しましょう。そこにエラーの正体が隠されています。また、意図しないアクセスが大量に来ていないかはアクセスログで確認します。このように、二つの窓口を分けて監視することで、トラブルに強いWebアプリを運用できるようになるのです。
9. まとめとしての可視化のメリット
最後に、なぜここまでしてログを丁寧に扱うのかをお話しします。それは、アプリがあなたの手を離れてサーバーという遠くの場所で動き始めたとき、唯一の「会話手段」がログだからです。パソコンの操作に慣れていない方でも、日記をつけるようにログを設計すれば、アプリが今どんな気持ち(状態)なのかが手に取るように分かります。
アクセスログとアプリログの分離は、単なる整理整頓ではなく、サービスを安全に、そして長く続けていくための「お守り」のような存在なのです。まずはファイルを二つに分けるところから、ぜひ挑戦してみてください。