mei_13のPython講座 ロゴ

【解説】Pythonで実践する「ELK Stack」:データの収集・解析・可視化をマスターしよう




Pythonで実践する「ELK Stack」:データの収集・解析・可視化をマスターしよう


Yukiのアイコン
【Yuki】 こんにちは、Hirokiくん。今日は以前少しお話しした、大量のデータを扱うための強力なツール群「ELK Stack」について、Pythonでの活用方法を交えて解説しようと思います。


Hirokiのアイコン
【Hiroki】 Yukiさん、よろしくお願いします!ELK Stackって、名前は聞いたことがあるんですけど、具体的に何ができるのかよくわかっていなくて……。Pythonとどう組み合わせて使うのか、すごく気になります。


Yukiのアイコン
【Yuki】 ふふ、大丈夫ですよ。一つずつゆっくり紐解いていきましょうね。ELK Stackは、膨大なログデータやテキスト情報を、素早く検索して、分析して、そして綺麗にグラフ化するための仕組みなんです。


Hirokiのアイコン
【Hiroki】 検索して分析して、グラフにする……。なんだか、データ分析の全部入りセットみたいな感じですね。


Yukiのアイコン
【Yuki】 そうですね。まずは、ELK Stackがどんな要素で構成されているか、その全体像から見ていくことにしましょう。

ELK Stackを構成する3つの要素


Yukiのアイコン
【Yuki】 「ELK」という名前は、実は3つのオープンソースソフトウェアの頭文字を取ったものなんです。ElasticsearchLogstashKibanaの3つですね。最近ではこれにBeatsという軽量なデータ転送ツールが加わって、「Elastic Stack」と呼ばれることも多いですが、基本はELKです。


Hirokiのアイコン
【Hiroki】 なるほど、それぞれの役割が違うんですね。


Yukiのアイコン
【Yuki】 はい。簡単に役割を整理しますね。

  1. Elasticsearch: データの保存と検索を担当する心臓部です。
  2. Logstash: データを収集し、加工してElasticsearchに送る中継役です。
  3. Kibana: Elasticsearchにあるデータをグラフや図にして表示する、Webインターフェースです。


Hirokiのアイコン
【Hiroki】 役割分担がはっきりしていますね。データを集めて(Logstash)、貯めて(Elasticsearch)、見る(Kibana)という流れ、ということでしょうか?


Yukiのアイコン
【Yuki】 その通りです。Hirokiくんは飲み込みが早くて助かります……。この中でも特に、Pythonエンジニアにとって重要なのがElasticsearchとの連携なんです。

Elasticsearch:高速な全文検索エンジン


Yukiのアイコン
【Yuki】 まず、ELK Stackの核となるElasticsearchについてお話ししますね。これは「全文検索エンジン」と呼ばれるもので、JSON形式のドキュメントを非常に高速に検索できるのが特徴です。


Hirokiのアイコン
【Hiroki】 JSON形式ということは、Pythonの辞書型みたいなデータをそのまま扱えるんですか?


Yukiのアイコン
【Yuki】 ええ、まさにそうです。一般的なリレーショナルデータベース(RDB)と違って、スキーマ(データの構造定義)を厳密に決めなくてもデータを投入できるので、形式が変わりやすいログデータなどに向いていると思います。


Hirokiのアイコン
【Hiroki】 それは便利そうですね。でも、どうしてそんなに速いんですか?


Yukiのアイコン
【Yuki】転置インデックス(Inverted Index)」という仕組みを使っているからなんです。本に例えると、巻末の索引のようなものですね。どの単語がどのページ(ドキュメント)に含まれているかをあらかじめリスト化しているので、膨大なデータの中からでも一瞬で見つけ出せる……のかもしれません。


Hirokiのアイコン
【Hiroki】 なるほど、索引があれば全部を読み直さなくていいですもんね。


Yukiのアイコン
【Yuki】 はい。そして、このElasticsearchには、Pythonから簡単に操作できる公式ライブラリが用意されています。

PythonでElasticsearchを操作する


Yukiのアイコン
【Yuki】 では、実際にPythonからElasticsearchにデータを送る方法を見てみましょう。まずはライブラリをインストールする必要があります。

pip install elasticsearch


Hirokiのアイコン
【Hiroki】 これで準備完了ですね。


Yukiのアイコン
【Yuki】 はい。次に、基本的な接続とデータの登録を行うコードを書いてみます。

from elasticsearch import Elasticsearch
from datetime import datetime

# Elasticsearchクライアントの作成(ローカルで動いている想定です)
es = Elasticsearch("http://localhost:9200")

# 登録するデータ
doc = {
    "author": "Hiroki",
    "text": "ELK Stackの勉強をしています。Pythonは楽しいです!",
    "timestamp": datetime.now(),
}

# データの登録(インデックス名は 'test-index')
res = es.index(index="test-index", document=doc)
print(f"結果: {res['result']}")

# データの検索
res = es.search(index="test-index", query={"match": {"text": "Python"}})
print(f"検索結果の数: {res['hits']['total']['value']}件")
for hit in res['hits']['hits']:
    print(hit["_source"])


Hirokiのアイコン
【Hiroki】 おぉ、すごくシンプルですね!辞書型データをそのまま index メソッドに渡すだけで保存されるなんて……。


Yukiのアイコン
【Yuki】 そうなんです。Webサービスのログや、スクレイピングで集めたテキストデータなどを、どんどんElasticsearchに投げ込んで、後から自由に検索する……という使い方が一般的ですね。

LogstashとBeatsによるデータ収集


Hirokiのアイコン
【Hiroki】 Elasticsearchのすごさはわかりました。でも、Logstashはどういう時に使うんですか?Pythonプログラムから直接送るなら、いらないような気もして……。


Yukiのアイコン
【Yuki】 それは良い質問ですね。実は、大規模なシステムになると、あちこちのサーバーからログが発生します。それらを一つひとつPythonプログラムで処理して送るのは大変ですし、プログラムに負荷がかかってしまいます。


Hirokiのアイコン
【Hiroki】 あ、確かに。ログの送信待ちでメインのプログラムが遅くなったら本末転倒ですね。


Yukiのアイコン
【Yuki】 ええ。そこでLogstashBeatsの出番です。 Beats(例えばFilebeat)は、サーバーに常駐して、ログファイルが更新されたらその差分を自動的に拾ってくれます。そしてLogstashがそのデータを受け取り、「IPアドレスから地域情報を特定する」とか「不要な文字列を削る」といった加工(フィルタリング)を行ってから、Elasticsearchに流し込むんです。


Hirokiのアイコン
【Hiroki】 なるほど。工場でいうところの「ベルトコンベヤー」と「検品・加工ライン」みたいな役割なんですね。


Yukiのアイコン
【Yuki】 その表現、とてもわかりやすいと思います……。このように役割を分けることで、Python側は「ログをファイルに書き出すだけ」という本来の仕事に集中できるんです。

Kibanaによるデータの可視化


Yukiのアイコン
【Yuki】 最後に、Kibanaについて少し触れておきましょう。Elasticsearchに溜まったデータはただの数字や文字の集まりですが、Kibanaを使えば、それをグラフや地図、タイムラインなどで視覚化できます。


Hirokiのアイコン
【Hiroki】 データの「見える化」ですね。


Yukiのアイコン
【Yuki】 はい。たとえば、Webサイトのアクセスログを可視化して、「どの時間帯にアクセスが多いか」とか「どの国からのアクセスが急増しているか」といったことを、プログラミングなしでダッシュボードに表示できるんです。


Hirokiのアイコン
【Hiroki】 それなら、エンジニアじゃない人でも状況を把握しやすそうですね。


Yukiのアイコン
【Yuki】 そうですね。フォントのサイズや色の使い分けも工夫されていますし、何よりリアルタイムでグラフが動く様子は、見ていて飽きないかもしれません……。

Pythonでの高度な活用:ログハンドラ


Hirokiのアイコン
【Hiroki】 Yukiさん、Pythonの標準ライブラリの logging モジュールと連携させることもできるんですか?


Yukiのアイコン
【Yuki】 もちろんです。実はそれが一番実用的な使い方かもしれません。 python-logstash というサードパーティ製ライブラリを使うと、いつもの logging の仕組みで、ログを自動的にLogstash経由でElasticsearchに飛ばせるようになります。


Hirokiのアイコン
【Hiroki】 それは便利ですね!いちいち個別に送信処理を書かなくて済むわけだ。


Yukiのアイコン
【Yuki】 はい。例えば、こんな風に設定します。

import logging
from logstash_async.handler import AsynchronousLogstashHandler

host = 'localhost'
port = 5000

# ロガーの設定
logger = logging.getLogger('python-logstash-logger')
logger.setLevel(logging.INFO)

# Logstashハンドラの追加
handler = AsynchronousLogstashHandler(host, port, database_path='logstash.db')
logger.addHandler(handler)

# ログを出力
logger.info("Pythonからの自動ログ送信テストです。")


Yukiのアイコン
【Yuki】 このように設定しておけば、プログラム内の色々な場所で logger.info() を呼び出すだけで、バックグラウンドで非同期にログがElasticsearchまで運ばれていきます。


Hirokiのアイコン
【Hiroki】 非同期なんですね!これならメイン処理の邪魔にならないし、すごくスマートです。

ELK Stackを学ぶメリット


Hirokiのアイコン
【Hiroki】 今日はありがとうございました、Yukiさん。ELK Stackって、単なるツールというより、データと向き合うための強力な「武器」みたいに感じました。


Yukiのアイコン
【Yuki】 そう言ってもらえると嬉しいです。今の時代、データは溜めるだけでは意味がなくて、それをどう活用するかが問われています。Pythonでデータを生成・加工し、ELKで管理・分析する……。この組み合わせを習得すれば、エンジニアとして大きな強みになると思います。


Hirokiのアイコン
【Hiroki】 僕も、まずは自分の作ったアプリのログを可視化するところから始めてみます!


Yukiのアイコン
【Yuki】 ええ、ぜひ挑戦してみてくださいね。もし途中で設定が上手くいかなくて困ったら、またいつでも聞いてください。……あ、でもあまり一度にたくさんのデータを送りすぎると、メモリをたくさん消費してパソコンが熱くなってしまうので、そこだけは注意してくださいね。


Hirokiのアイコン
【Hiroki】 あはは、気をつけます。熱暴走は怖いですもんね。


Yukiのアイコン
【Yuki】 ……そうですね。冬場なら少し暖かいかもしれませんが、やっぱり機械には優しくしてあげたいですから。では、今日はここまでにしましょうか。


Hirokiのアイコン
【Hiroki】 はい!ありがとうございました、Yukiさん!

参考資料



< Prometheus Client Library
コラム一覧に戻る
Fabric >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
● 高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!



AIアシスタント Yuki