Pythonで実践する「ELK Stack」:データの収集・解析・可視化をマスターしよう
![]()
【Yuki】
こんにちは、Hirokiくん。今日は以前少しお話しした、大量のデータを扱うための強力なツール群「ELK Stack」について、Pythonでの活用方法を交えて解説しようと思います。
![]()
【Hiroki】
Yukiさん、よろしくお願いします!ELK Stackって、名前は聞いたことがあるんですけど、具体的に何ができるのかよくわかっていなくて……。Pythonとどう組み合わせて使うのか、すごく気になります。
![]()
【Yuki】
ふふ、大丈夫ですよ。一つずつゆっくり紐解いていきましょうね。ELK Stackは、膨大なログデータやテキスト情報を、素早く検索して、分析して、そして綺麗にグラフ化するための仕組みなんです。
![]()
【Hiroki】
検索して分析して、グラフにする……。なんだか、データ分析の全部入りセットみたいな感じですね。
![]()
【Yuki】
そうですね。まずは、ELK Stackがどんな要素で構成されているか、その全体像から見ていくことにしましょう。
ELK Stackを構成する3つの要素
![]()
【Yuki】
「ELK」という名前は、実は3つのオープンソースソフトウェアの頭文字を取ったものなんです。Elasticsearch、Logstash、Kibanaの3つですね。最近ではこれにBeatsという軽量なデータ転送ツールが加わって、「Elastic Stack」と呼ばれることも多いですが、基本はELKです。
![]()
【Hiroki】
なるほど、それぞれの役割が違うんですね。
![]()
【Yuki】
はい。簡単に役割を整理しますね。
- Elasticsearch: データの保存と検索を担当する心臓部です。
- Logstash: データを収集し、加工してElasticsearchに送る中継役です。
- Kibana: Elasticsearchにあるデータをグラフや図にして表示する、Webインターフェースです。
![]()
【Hiroki】
役割分担がはっきりしていますね。データを集めて(Logstash)、貯めて(Elasticsearch)、見る(Kibana)という流れ、ということでしょうか?
![]()
【Yuki】
その通りです。Hirokiくんは飲み込みが早くて助かります……。この中でも特に、Pythonエンジニアにとって重要なのがElasticsearchとの連携なんです。
Elasticsearch:高速な全文検索エンジン
![]()
【Yuki】
まず、ELK Stackの核となるElasticsearchについてお話ししますね。これは「全文検索エンジン」と呼ばれるもので、JSON形式のドキュメントを非常に高速に検索できるのが特徴です。
![]()
【Hiroki】
JSON形式ということは、Pythonの辞書型みたいなデータをそのまま扱えるんですか?
![]()
【Yuki】
ええ、まさにそうです。一般的なリレーショナルデータベース(RDB)と違って、スキーマ(データの構造定義)を厳密に決めなくてもデータを投入できるので、形式が変わりやすいログデータなどに向いていると思います。
![]()
【Hiroki】
それは便利そうですね。でも、どうしてそんなに速いんですか?
![]()
【Yuki】
「転置インデックス(Inverted Index)」という仕組みを使っているからなんです。本に例えると、巻末の索引のようなものですね。どの単語がどのページ(ドキュメント)に含まれているかをあらかじめリスト化しているので、膨大なデータの中からでも一瞬で見つけ出せる……のかもしれません。
![]()
【Hiroki】
なるほど、索引があれば全部を読み直さなくていいですもんね。
![]()
【Yuki】
はい。そして、このElasticsearchには、Pythonから簡単に操作できる公式ライブラリが用意されています。
PythonでElasticsearchを操作する
![]()
【Yuki】
では、実際にPythonからElasticsearchにデータを送る方法を見てみましょう。まずはライブラリをインストールする必要があります。
pip install elasticsearch
![]()
【Hiroki】
これで準備完了ですね。
![]()
【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】
おぉ、すごくシンプルですね!辞書型データをそのまま index メソッドに渡すだけで保存されるなんて……。
![]()
【Yuki】
そうなんです。Webサービスのログや、スクレイピングで集めたテキストデータなどを、どんどんElasticsearchに投げ込んで、後から自由に検索する……という使い方が一般的ですね。
LogstashとBeatsによるデータ収集
![]()
【Hiroki】
Elasticsearchのすごさはわかりました。でも、Logstashはどういう時に使うんですか?Pythonプログラムから直接送るなら、いらないような気もして……。
![]()
【Yuki】
それは良い質問ですね。実は、大規模なシステムになると、あちこちのサーバーからログが発生します。それらを一つひとつPythonプログラムで処理して送るのは大変ですし、プログラムに負荷がかかってしまいます。
![]()
【Hiroki】
あ、確かに。ログの送信待ちでメインのプログラムが遅くなったら本末転倒ですね。
![]()
【Yuki】
ええ。そこでLogstashやBeatsの出番です。
Beats(例えばFilebeat)は、サーバーに常駐して、ログファイルが更新されたらその差分を自動的に拾ってくれます。そしてLogstashがそのデータを受け取り、「IPアドレスから地域情報を特定する」とか「不要な文字列を削る」といった加工(フィルタリング)を行ってから、Elasticsearchに流し込むんです。
![]()
【Hiroki】
なるほど。工場でいうところの「ベルトコンベヤー」と「検品・加工ライン」みたいな役割なんですね。
![]()
【Yuki】
その表現、とてもわかりやすいと思います……。このように役割を分けることで、Python側は「ログをファイルに書き出すだけ」という本来の仕事に集中できるんです。
Kibanaによるデータの可視化
![]()
【Yuki】
最後に、Kibanaについて少し触れておきましょう。Elasticsearchに溜まったデータはただの数字や文字の集まりですが、Kibanaを使えば、それをグラフや地図、タイムラインなどで視覚化できます。
![]()
【Hiroki】
データの「見える化」ですね。
![]()
【Yuki】
はい。たとえば、Webサイトのアクセスログを可視化して、「どの時間帯にアクセスが多いか」とか「どの国からのアクセスが急増しているか」といったことを、プログラミングなしでダッシュボードに表示できるんです。
![]()
【Hiroki】
それなら、エンジニアじゃない人でも状況を把握しやすそうですね。
![]()
【Yuki】
そうですね。フォントのサイズや色の使い分けも工夫されていますし、何よりリアルタイムでグラフが動く様子は、見ていて飽きないかもしれません……。
Pythonでの高度な活用:ログハンドラ
![]()
【Hiroki】
Yukiさん、Pythonの標準ライブラリの logging モジュールと連携させることもできるんですか?
![]()
【Yuki】
もちろんです。実はそれが一番実用的な使い方かもしれません。 python-logstash というサードパーティ製ライブラリを使うと、いつもの logging の仕組みで、ログを自動的にLogstash経由でElasticsearchに飛ばせるようになります。
![]()
【Hiroki】
それは便利ですね!いちいち個別に送信処理を書かなくて済むわけだ。
![]()
【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】
このように設定しておけば、プログラム内の色々な場所で logger.info() を呼び出すだけで、バックグラウンドで非同期にログがElasticsearchまで運ばれていきます。
![]()
【Hiroki】
非同期なんですね!これならメイン処理の邪魔にならないし、すごくスマートです。
ELK Stackを学ぶメリット
![]()
【Hiroki】
今日はありがとうございました、Yukiさん。ELK Stackって、単なるツールというより、データと向き合うための強力な「武器」みたいに感じました。
![]()
【Yuki】
そう言ってもらえると嬉しいです。今の時代、データは溜めるだけでは意味がなくて、それをどう活用するかが問われています。Pythonでデータを生成・加工し、ELKで管理・分析する……。この組み合わせを習得すれば、エンジニアとして大きな強みになると思います。
![]()
【Hiroki】
僕も、まずは自分の作ったアプリのログを可視化するところから始めてみます!
![]()
【Yuki】
ええ、ぜひ挑戦してみてくださいね。もし途中で設定が上手くいかなくて困ったら、またいつでも聞いてください。……あ、でもあまり一度にたくさんのデータを送りすぎると、メモリをたくさん消費してパソコンが熱くなってしまうので、そこだけは注意してくださいね。
![]()
【Hiroki】
あはは、気をつけます。熱暴走は怖いですもんね。
![]()
【Yuki】
……そうですね。冬場なら少し暖かいかもしれませんが、やっぱり機械には優しくしてあげたいですから。では、今日はここまでにしましょうか。
![]()
【Hiroki】
はい!ありがとうございました、Yukiさん!
参考資料
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


