Flaskログの可視化!ElasticsearchとKibanaで可観測性を実現する完全ガイド
生徒
「Flaskで作ったアプリの動きを、もっとかっこよくグラフとかで確認する方法はありますか?」
先生
「それなら『Elasticsearch(エラスティックサーチ)』と『Kibana(キバナ)』を使うのがおすすめです。ログを魔法のように綺麗な図表にできますよ。」
生徒
「難しそうですが、初心者でも設定できるでしょうか?」
先生
「仕組みを理解すれば大丈夫です。データの集め方からグラフにするまでの流れを、一歩ずつ解説していきましょう!」
1. ログの可視化とElasticsearch/Kibanaの役割
ウェブアプリケーションを運用していると、毎日膨大な量の「ログ(動作記録)」が溜まっていきます。しかし、真っ黒な画面に流れる大量のテキスト文字を人間が目で追い続けるのは限界があります。そこで登場するのが「可視化(かしか)」という技術です。
可視化とは、文字だけの情報をグラフやチャートにして「目に見える形」にすることを指します。これを実現するために世界中で使われているのが「ELKスタック」と呼ばれる道具のセットです。その中心となるのが、データを高速で検索するElasticsearchと、それを画面に描画するKibanaです。これらを組み合わせることで、「今日は何人がアクセスしたか」「エラーは何回起きたか」を一瞬で把握できるようになります。
2. Elasticsearch(エラスティックサーチ)は巨大な図書館
まず、Elasticsearchについて説明します。これは簡単に言うと「ものすごく頭の良い、超巨大な図書館」のようなものです。Flaskから送られてきた大量のログデータを、ただ保管するだけでなく、後から一瞬で探し出せるように整理して保管してくれます。
専門用語では「全文検索エンジン」と呼ばれますが、今は「何でもすぐに探し出してくれる優秀な倉庫」だと思えば十分です。この倉庫があるおかげで、一ヶ月前のログの中から特定のユーザーの動きだけを抜き出したり、特定のエラーメッセージだけを抽出したりすることが可能になります。
3. Kibana(キバナ)は魔法の画板
次に、Kibanaです。Elasticsearchが「倉庫」なら、Kibanaは「その倉庫の中身を綺麗に表示するモニター(画板)」です。Elasticsearchの中に保存されている数字や文字を読み取って、棒グラフ、円グラフ、折れ線グラフ、さらには地図の上にデータをマッピングすることもできます。
初心者の人がKibanaを初めて見ると、その近未来的な画面に驚くかもしれません。プログラミングの知識がなくても、マウス操作で「ここをグラフにして!」と指示を出すだけで、アプリの健康状態を映し出す「ダッシュボード」を作ることができます。これが、システムの状況を把握する「可観測性(オブザーバビリティ)」の要となります。
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」の導入
FlaskとElasticsearchの間に、もう一つ「Logstash(ログスタッシュ)」という道具を挟むのが一般的です。これは「データの加工工場兼、配送トラック」のような役割をします。Flaskが出した生データを、Elasticsearchが読みやすい形に整えて、安全に運んでくれます。
なぜ直接送らないのかというと、Logstashがデータを「構造化(整理整頓)」してくれるからです。例えば「2023/10/01 10:00 ユーザーA ログイン成功」という一行の文章を、「日付」「時間」「誰が」「何を」という項目に分解してくれます。この分解作業があるからこそ、後でKibanaで「ユーザーごとのグラフ」が作れるようになるのです。
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でダッシュボードを作成する流れ
ログがElasticsearchに溜まり始めたら、いよいよKibanaの出番です。Kibanaを開くと、まず「インデックスパターン」というものを設定します。これは「どの倉庫のデータを使いますか?」とKibanaに教えてあげる作業です。
設定が終わると、画面上に溜まったログが一覧で表示されます。そこから「レンズ(Lens)」という機能を使って、例えば「price」の項目を選んでグラフ化すると、売上の推移が折れ線グラフで表示されます。パソコンを触ったことがない人でも、直感的な操作で自分だけの管理画面が出来上がっていきます。これが可視化の醍醐味です。
8. エラー通知とアラートの設定
可視化ができるようになると、次にやりたくなるのが「異常の検知」です。ずっとグラフを見ているわけにはいきませんから、エラーが急増したときに自動で教えてくれる機能を使います。Elasticsearchには、データの変化を見守る機能があります。
例えば、5分間に10回以上のエラーログが記録されたら、メールやチャットアプリに通知を飛ばすといった設定が可能です。これにより、アプリのトラブルに誰よりも早く気づき、すぐに対応できるようになります。これもログ管理の重要な目的の一つです。
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()
このように、セキュリティを意識したログの書き方を習慣にすることで、信頼されるエンジニアへの道が開けます。