Flaskで環境ごとにログ設定を切り替える!本番・開発の管理テクニック
生徒
「先生、自分のパソコンで開発している時は細かいログを見たいんですけど、本番で公開する時は大事なエラーだけを記録したいんです。これって手書きで毎回書き直すしかないんですか?」
先生
「そんなことはありませんよ!Flaskには『環境変数』という仕組みを使って、開発用と本番用でログの設定を自動でガチャンと切り替えるテクニックがあるんです。」
生徒
「自動で切り替わるんですか!設定ミスも減りそうですね。どうすればいいのか教えてください!」
先生
「はい、まずは『環境』という考え方から順番に解説していきましょう。」
1. 「開発環境」と「本番環境」の違いを知ろう
プログラミングを始めたばかりの方が最初に覚えるべき大切な考え方が、環境(かんきょう)の使い分けです。アプリが動く場所は、大きく分けて二つあります。
- 開発環境(ローカル環境): あなたが今触っている自分のパソコンのことです。ここでは、プログラムの動きを細かくチェックするために、たくさんのログを出力します。
- 本番環境(プロダクション環境): インターネット上で実際に世界中の人が使うサーバーのことです。ここでは、余計な情報を出しすぎるとサーバーが重くなったり、セキュリティ上のリスクになったりするため、必要最低限のログに絞ります。
これを「可観測性(オブザーバビリティ)」の観点から見ると、開発時は『透明度』を高くし、本番では『効率』を重視するという戦略になります。これを自動で切り替えるのが、今回学ぶ Flask の高度な設定管理です。
2. 環境変数(FLASK_ENV)でモードを切り替える仕組み
パソコンには、プログラムの外側から「今は本番ですよ」「今は開発中ですよ」と合図を送るための、環境変数(かんきょうへんすう)という名前の付いた設定値があります。Flaskでは、この値を読み取って動作を分岐させることができます。
例えば、FLASK_ENV という名前の設定が development なら開発、production なら本番、という風にルールを決めます。これによって、コードの中身を一行も書き換えることなく、起動する場所に合わせて勝手にログの設定が切り替わるようになるのです。
3. 【実践】環境ごとにクラスを分ける設定方法
まずは、設定の内容を「クラス」という箱にまとめて整理しましょう。開発用と本番用で、別々の設定を作っておきます。
class Config:
"""共通の基本設定"""
LOG_LEVEL = "INFO"
class DevelopmentConfig(Config):
"""開発用の設定:細かいログまで出す"""
LOG_LEVEL = "DEBUG"
class ProductionConfig(Config):
"""本番用の設定:重大なエラーだけ出す"""
LOG_LEVEL = "ERROR"
このように整理しておくと、後から「本番のログレベルだけ変えたい」と思った時に、どこを直せばいいか一目で分かります。
4. アプリ起動時にログ設定を読み込むコード
次に、先ほど作ったクラスをFlaskアプリに読み込ませる仕組みを作ります。ここでは Python の os.environ という機能を使って、パソコンに設定された「合図(環境変数)」を読み取ります。
import os
import logging
from flask import Flask
app = Flask(__name__)
# 環境変数から「今どの環境か」を読み取る(デフォルトは開発用にする)
env = os.environ.get('FLASK_ENV', 'development')
if env == 'production':
app.config.from_object(ProductionConfig)
else:
app.config.from_object(DevelopmentConfig)
# 読み込んだ設定を使って、ログのレベルを決定する
app.logger.setLevel(app.config['LOG_LEVEL'])
@app.route('/')
def hello():
app.logger.debug("開発中しか見えない細かいログです")
app.logger.error("これは本番でも見える重大なログです")
return "ログ設定の切り替えテスト中!"
5. 開発環境:DEBUGレベルで細かく追跡する
開発環境では、ログのレベルを DEBUG(デバッグ) に設定します。デバッグとは、プログラムの「虫(間違い)」を見つけて直す作業のことです。開発中は何が起きているかすべて知りたいので、計算の途中経過や、どんなデータが送られてきたかなどの情報をすべて画面(コンソール)に出力させます。
Flaskのデフォルトのログ機能は非常に優秀で、開発モードに切り替えると、リクエストがあった瞬間に詳細な情報を出してくれます。これによって、初めてパソコンでプログラミングをする方でも、「今何が起きたか」をリアルタイムで追いかけることができるようになります。
6. 本番環境:ERRORレベルでサーバーを守る
本番環境で一番怖いのは、ログが出すぎてサーバーの保存容量(ストレージ)がいっぱいになってしまうことです。また、詳細な情報を出しすぎると、悪い人に「このアプリはこういう仕組みで動いているんだな」とヒントを与えてしまうリスクもあります。
そのため、本番では ERROR(エラー) または WARNING(ワーニング) レベルに設定し、「修理が必要な一大事」の時だけログに残るようにします。こうすることで、サーバーの負荷を下げ、セキュリティを守りつつ、トラブルが起きたときだけ確実に情報をキャッチできる体制を整えます。
7. 【上級編】環境ごとにログの出力先を変える
さらに本格的な管理をしたい場合は、ログの「出し先」も切り替えましょう。開発時は「画面」に、本番時は「ファイル」に保存するように設定します。これには、以前学んだ FileHandler などを環境ごとに使い分けます。
if not app.debug: # 本番環境の場合
import logging
from logging.handlers import RotatingFileHandler
# 本番用:ファイルに保存する設定を追加
file_handler = RotatingFileHandler('production.log', maxBytes=10240, backupCount=10)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
))
app.logger.addHandler(file_handler)
8. 実際にどうやって「合図」を送るのか(実行方法)
「環境変数で切り替えるのは分かったけど、どうやってその変数に値を入れるの?」という疑問にお答えします。アプリを動かすための黒い画面(コマンドプロンプトやターミナル)で、実行する直前に以下のように入力します。
# Windowsの場合
set FLASK_ENV=production
python app.py
# MacやLinuxの場合
export FLASK_ENV=production
python app.py
この一行を実行するだけで、プログラムを一切触らずに「本番モード」で起動させることができます。これができるようになると、初心者から一歩進んで、プロの現場でも通用する「環境管理」のスキルが身についたと言えます。
9. 設定が正しく切り替わっているか確認するコツ
設定を切り替えたら、本当に意図したレベルになっているか確認しましょう。最も簡単な方法は、アプリの起動直後に「現在のログレベル」を表示させるコードを一行入れることです。
print(f"現在のログレベルは: {app.logger.getEffectiveLevel()}")
# ちなみに 10 は DEBUG、20 は INFO、40 は ERROR を意味します
数字が表示されるので少し驚くかもしれませんが、これもパソコンの中での約束事です。こうして一つずつ「今の状態」を確かめる癖をつけることが、ミスを防ぐ最強のテクニックになります。環境ごとのログ切り替えをマスターして、スマートなFlask開発を楽しみましょう!