FlaskでログをJSON形式で出力!メリットと設定方法を初心者向けに徹底解説
生徒
「先生、Flaskのログを見てみたのですが、普通の文章だと後から特定の情報を探すのが大変そうです。もっと整理された形で記録する方法はありませんか?」
先生
「その通りですね。実は、ログを『JSON(ジェイソン)』という形式で出力すると、コンピューターが内容を理解しやすくなり、検索や分析が劇的に楽になるんですよ。」
生徒
「JSON…ですか?何だか難しそうですが、私のような初心者でも設定できるでしょうか?」
先生
「大丈夫です!便利な道具(ライブラリ)を使えば、少しのコードを追加するだけで魔法のようにログが整列します。まずはその仕組みから見ていきましょう!」
1. ログをJSON形式で出すとはどういうこと?
プログラミングを始めたばかりの方が最初に目にするログは、人間が読むための「普通の文章」であることが多いです。これをテキスト形式と呼びます。しかし、アプリが成長してログが何万行にもなると、人間が目で追うのは不可能になります。
そこで登場するのがJSON(JavaScript Object Notation)です。JSONとは、データを「名前(ラベル)」と「値」のペアで整理する書き方のルールです。例えば、「今日は晴れ」と書く代わりに、「天気:晴れ」と書くようなイメージです。このように整理して記録することを構造化ログと呼び、現代のシステム開発では「可観測性(オブザーバビリティ)」を高めるために欠かせない技術となっています。
2. 普通のログとJSON形式のログを比較してみよう
実際にどれくらい見た目が違うのか、具体例で見てみましょう。通常のログは日記のようなものですが、JSON形式は整理整頓された「名簿」や「台帳」のようなものです。
【通常のテキスト形式】
2026-01-12 10:00:00 INFO in app: ユーザーAがログインしました
【JSON形式】
{"time": "2026-01-12 10:00:00", "level": "INFO", "message": "ユーザーAがログイン", "user_id": "A"}
JSON形式の方は、"time"や"message"といったラベルが付いています。これによって、後から「レベルがINFOのものだけ抜き出す」「メッセージの内容だけ検索する」といった操作がコンピューターで一瞬で行えるようになります。この「検索のしやすさ」こそが、JSONログ最大の魅力です。
3. なぜ初心者のうちからJSON形式を使うべきなの?
「自分一人でアプリを作っているうちは、普通の文章で十分じゃない?」と思うかもしれません。しかし、JSON形式には以下のようなメリットがあります。
- ミスを防げる: データの形が決まっているため、情報の抜け漏れに気づきやすくなります。
- 分析ツールと相性がいい: ログをグラフにしたり、エラーの回数を自動で集計したりする便利なツール(DatadogやCloudWatch Logsなど)は、JSON形式が大好きです。
- 情報の追加が簡単: ログの中に「OSの種類」や「処理にかかった時間」など、新しい項目を増やしても全体の形が崩れません。
初心者の方こそ、早い段階でこの「構造化」の考え方に触れておくことで、将来的に大きなシステムを作る際の基礎体力が身につきます。
4. 【準備】python-json-loggerを導入しよう
PythonやFlaskには、標準でもログを出す機能がありますが、JSON形式にするには少し手間がかかります。そこで、専門の部品であるpython-json-loggerという拡張機能(ライブラリ)を使いましょう。
パソコンを初めて触る方でも、以下の魔法の言葉(コマンド)を「ターミナル」や「コマンドプロンプト」という黒い画面に入力するだけで準備が完了します。
pip install python-json-logger
「pip(ピップ)」は、新しい道具をインターネットから取ってきてインストールしてくれる、とても便利な執事のような存在です。これが終われば、準備万端です!
5. 【実践】FlaskでJSONログを出力する基本コード
それでは、実際にFlaskアプリでJSONログを出すための最小限の設定を書いてみましょう。ここでは「フォーマッター」という、ログの見た目を整える担当者に、JSONのルールを教える作業を行います。
from flask import Flask
import logging
from pythonjsonlogger import jsonlogger
app = Flask(__name__)
# ログの設定を行う
log_handler = logging.StreamHandler()
# どんな項目をJSONに含めるか指定する
formatter = jsonlogger.JsonFormatter('%(asctime)s %(levelname)s %(message)s')
log_handler.setFormatter(formatter)
# Flaskのログ担当者にこの設定を渡す
app.logger.addHandler(log_handler)
app.logger.setLevel(logging.INFO)
@app.route('/')
def index():
app.logger.info("JSON形式のログテスト成功!")
return "ログを確認してね"
if __name__ == '__main__':
app.run()
6. 独自の情報をログに追加する方法
JSONログの真価は、自分で決めた自由な情報を追加できるところにあります。例えば、特定の「商品ID」や「注文番号」を一緒に記録したい場合です。普通の文章だとどこに書くか迷いますが、JSONなら新しいラベルを付けるだけです。
@app.route('/order/<int:order_id>')
def order(order_id):
# extraという引数を使うことで、自由な項目をJSONに追加できます
app.logger.info("注文を受け付けました", extra={'order_id': order_id, 'status': 'pending'})
return f"注文番号 {order_id} を処理中..."
これを出力すると、{"order_id": 123, "status": "pending"} という風に、プログラミングコードで扱いやすい形で記録されます。後から「特定の注文番号のログだけ全部見せて」とコンピューターにお願いするのがとても簡単になりますね。
7. エラー発生時もJSONなら分かりやすい
アプリに不具合が起きたとき、ログがぐちゃぐちゃだとパニックになります。JSON形式なら、エラーの内容(種類)と、どこで起きたかという情報が整然と並びます。
@app.route('/error')
def cause_error():
try:
result = 1 / 0
except Exception as e:
# エラーの内容をJSONで詳しく記録する
app.logger.error("エラーが発生しました", extra={'error_type': type(e).__name__, 'reason': str(e)})
return "ごめんなさい、エラーです"
このようにしておけば、後で「どんなエラーが何回起きたか」をグラフにするのも簡単です。初心者にとって、エラーは怖いものですが、このように冷静に記録を取ることで、解決への道筋がはっきりと見えるようになります。
8. 運用で役立つ「ファイル保存」との組み合わせ
これまでは画面にログを出すだけでしたが、実際にはログをファイルとして保存しておくことが多いです。JSON形式でファイルに保存しておけば、あとでそのファイルを別の分析プログラムに読み込ませることもできます。
import logging
from logging.handlers import RotatingFileHandler
# ファイルに書き出す担当者を作る
file_handler = RotatingFileHandler('app_log.json', maxBytes=10000, backupCount=3)
file_formatter = jsonlogger.JsonFormatter('%(asctime)s %(levelname)s %(message)s')
file_handler.setFormatter(file_formatter)
# アプリに登録
app.logger.addHandler(file_handler)
RotatingFileHandler(ローテーティング・ファイルハンドラ)というのは、ログファイルが巨大になりすぎないように、古くなったら新しいファイルに切り替えてくれる、賢いお掃除係のような機能です。これで、あなたのアプリの記録は完璧に管理されます。
9. 設定が反映されないときのチェックポイント
もしログがJSONにならなかったり、エラーが出たりした場合は、以下の点を確認してみましょう。
- スペルミス:
JsonFormatterの大文字・小文字は正しく書けていますか? - インストール忘れ: 手順4の
pip installは成功しましたか? - レベルの設定:
app.logger.setLevel(logging.INFO)を忘れると、軽い通知(INFO)が出ないことがあります。