カテゴリ: Flask 更新日: 2026/02/06

Flaskログの可視化!ElasticsearchとKibanaで可観測性を実現する完全ガイド

FlaskとElasticsearch/Kibanaでログの可視化を行う流れ
FlaskとElasticsearch/Kibanaでログの可視化を行う流れ

先生と生徒の会話形式で理解しよう

生徒

「Flaskで作ったアプリの動きを、もっとかっこよくグラフとかで確認する方法はありますか?」

先生

「それなら『Elasticsearch(エラスティックサーチ)』と『Kibana(キバナ)』を使うのがおすすめです。ログを魔法のように綺麗な図表にできますよ。」

生徒

「難しそうですが、初心者でも設定できるでしょうか?」

先生

「仕組みを理解すれば大丈夫です。データの集め方からグラフにするまでの流れを、一歩ずつ解説していきましょう!」

1. ログの可視化とElasticsearch/Kibanaの役割

1. ログの可視化とElasticsearch/Kibanaの役割
1. ログの可視化とElasticsearch/Kibanaの役割

ウェブアプリケーションを運用していると、毎日膨大な量の「ログ(動作記録)」が溜まっていきます。しかし、真っ黒な画面に流れる大量のテキスト文字を人間が目で追い続けるのは限界があります。そこで登場するのが「可視化(かしか)」という技術です。

可視化とは、文字だけの情報をグラフやチャートにして「目に見える形」にすることを指します。これを実現するために世界中で使われているのが「ELKスタック」と呼ばれる道具のセットです。その中心となるのが、データを高速で検索するElasticsearchと、それを画面に描画するKibanaです。これらを組み合わせることで、「今日は何人がアクセスしたか」「エラーは何回起きたか」を一瞬で把握できるようになります。

2. Elasticsearch(エラスティックサーチ)は巨大な図書館

2. Elasticsearch(エラスティックサーチ)は巨大な図書館
2. Elasticsearch(エラスティックサーチ)は巨大な図書館

まず、Elasticsearchについて説明します。これは簡単に言うと「ものすごく頭の良い、超巨大な図書館」のようなものです。Flaskから送られてきた大量のログデータを、ただ保管するだけでなく、後から一瞬で探し出せるように整理して保管してくれます。

専門用語では「全文検索エンジン」と呼ばれますが、今は「何でもすぐに探し出してくれる優秀な倉庫」だと思えば十分です。この倉庫があるおかげで、一ヶ月前のログの中から特定のユーザーの動きだけを抜き出したり、特定のエラーメッセージだけを抽出したりすることが可能になります。

3. Kibana(キバナ)は魔法の画板

3. Kibana(キバナ)は魔法の画板
3. Kibana(キバナ)は魔法の画板

次に、Kibanaです。Elasticsearchが「倉庫」なら、Kibanaは「その倉庫の中身を綺麗に表示するモニター(画板)」です。Elasticsearchの中に保存されている数字や文字を読み取って、棒グラフ、円グラフ、折れ線グラフ、さらには地図の上にデータをマッピングすることもできます。

初心者の人がKibanaを初めて見ると、その近未来的な画面に驚くかもしれません。プログラミングの知識がなくても、マウス操作で「ここをグラフにして!」と指示を出すだけで、アプリの健康状態を映し出す「ダッシュボード」を作ることができます。これが、システムの状況を把握する「可観測性(オブザーバビリティ)」の要となります。

4. Flaskからログを送るための最初のステップ

4. Flaskからログを送るための最初のステップ
4. Flaskからログを送るための最初のステップ

それでは、実際にFlaskアプリからログを出す準備をしましょう。まずはPythonのプログラムの中で、ログを記録するための基本的なコードを書きます。ここでは、誰かがサイトに訪れたときに「訪問者あり!」という記録を残すシンプルな仕組みを作ります。


from flask import Flask
import logging

app = Flask(__name__)

# ログの設定(INFOという標準的なレベルに設定します)
logging.basicConfig(level=logging.INFO)

@app.route('/')
def home():
    # ログを記録します
    app.logger.info('ホームページが閲覧されました')
    return 'ようこそ!ログの可視化の世界へ!'

if __name__ == '__main__':
    app.run(debug=True)

この段階では、まだログは自分のパソコンの画面に出るだけです。これをElasticsearchに届けるために、次のステップへ進みます。

5. データを配送する仕組み「Logstash」の導入

5. データを配送する仕組み「Logstash」の導入
5. データを配送する仕組み「Logstash」の導入

FlaskとElasticsearchの間に、もう一つ「Logstash(ログスタッシュ)」という道具を挟むのが一般的です。これは「データの加工工場兼、配送トラック」のような役割をします。Flaskが出した生データを、Elasticsearchが読みやすい形に整えて、安全に運んでくれます。

なぜ直接送らないのかというと、Logstashがデータを「構造化(整理整頓)」してくれるからです。例えば「2023/10/01 10:00 ユーザーA ログイン成功」という一行の文章を、「日付」「時間」「誰が」「何を」という項目に分解してくれます。この分解作業があるからこそ、後でKibanaで「ユーザーごとのグラフ」が作れるようになるのです。

6. Pythonから構造化されたログを出力する

6. Pythonから構造化されたログを出力する
6. Pythonから構造化されたログを出力する

Logstashが処理しやすいように、Flask側でも「JSON(ジェイソン)」という形式でログを出力してみましょう。JSONとは、コンピュータが最も理解しやすい、名前と値がペアになった書き方のことです。これを使うと、可視化の精度がぐっと上がります。


import json
from flask import Flask

app = Flask(__name__)

@app.route('/order')
def order():
    # 注文情報を辞書(データセット)で作ります
    order_data = {
        "event": "item_purchase",
        "item_id": 101,
        "price": 2500,
        "status": "success"
    }
    
    # JSON形式に変換して文字として出力(これをログとして保存します)
    log_message = json.dumps(order_data)
    print(log_message) 
    
    return '注文が完了しました。ログを送信します。'

if __name__ == '__main__':
    app.run()

このようにデータに意味を持たせて出力することが、プロフェッショナルなログ管理の第一歩です。

7. Kibanaでダッシュボードを作成する流れ

7. Kibanaでダッシュボードを作成する流れ
7. Kibanaでダッシュボードを作成する流れ

ログがElasticsearchに溜まり始めたら、いよいよKibanaの出番です。Kibanaを開くと、まず「インデックスパターン」というものを設定します。これは「どの倉庫のデータを使いますか?」とKibanaに教えてあげる作業です。

設定が終わると、画面上に溜まったログが一覧で表示されます。そこから「レンズ(Lens)」という機能を使って、例えば「price」の項目を選んでグラフ化すると、売上の推移が折れ線グラフで表示されます。パソコンを触ったことがない人でも、直感的な操作で自分だけの管理画面が出来上がっていきます。これが可視化の醍醐味です。

8. エラー通知とアラートの設定

8. エラー通知とアラートの設定
8. エラー通知とアラートの設定

可視化ができるようになると、次にやりたくなるのが「異常の検知」です。ずっとグラフを見ているわけにはいきませんから、エラーが急増したときに自動で教えてくれる機能を使います。Elasticsearchには、データの変化を見守る機能があります。

例えば、5分間に10回以上のエラーログが記録されたら、メールやチャットアプリに通知を飛ばすといった設定が可能です。これにより、アプリのトラブルに誰よりも早く気づき、すぐに対応できるようになります。これもログ管理の重要な目的の一つです。

9. 実際の運用で気をつけるポイント

9. 実際の運用で気をつけるポイント
9. 実際の運用で気をつけるポイント

ログの可視化はとても便利ですが、一つだけ注意点があります。それは「ログを溜めすぎないこと」です。何でもかんでも記録して保存しておくと、あっという間にパソコンやサーバーの容量がいっぱいになってしまいます。

「本当に必要な情報は何だろう?」と考えながらログの設計をすることが大切です。また、個人情報(名前や住所など)をそのままログに出さないようにする配慮も必要です。安全で効率的なログ管理を目指しましょう。


from flask import Flask, request

app = Flask(__name__)

@app.route('/login', methods=['POST'])
def login():
    username = request.form.get('user')
    # パスワードは絶対にログに出してはいけません!
    # 代わりに「ログイン試行があった」という事実だけを記録します
    app.logger.warning(f'ユーザー {username} がログインを試みました')
    return 'ログイン処理中...'

if __name__ == '__main__':
    app.run()

このように、セキュリティを意識したログの書き方を習慣にすることで、信頼されるエンジニアへの道が開けます。

カテゴリの一覧へ
新着記事
New1
Flask
Flaskで非同期フォーム送信(Ajax POST)を実装する方法を解説!初心者でもわかるステップ解説
New2
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
New3
Python
PythonでMySQLに接続する方法!pymysqlの基本的な使い方
New4
Flask
FlaskのURLルールとは?ルーティングの基本と動的URLの作り方を解説
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.2
Java&Spring記事人気No2
Flask
Flaskでデータベースを使う基本!SQLAlchemyの導入方法をやさしく解説
No.3
Java&Spring記事人気No3
Python
Pythonでリストの要素を検索・取得する方法!index()やin演算子の活用法
No.4
Java&Spring記事人気No4
Python
Pythonプログラムの書き方を基礎から学ぼう!初心者が覚えるべき文法とは?
No.5
Java&Spring記事人気No5
Python
Pythonで仮想環境(venv)を作る方法!初心者向けに環境構築をステップ解説
No.6
Java&Spring記事人気No6
Python
Pythonのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.7
Java&Spring記事人気No7
Flask
Flaskアプリの環境変数をクラウドで安全に設定する方法!初心者のための完全ガイド
No.8
Java&Spring記事人気No8
Flask
Flaskでクラウド上のメッセージキュー(SQS/PubSub)を扱う完全ガイド!初心者向け解説