2026年7月13日
2026年7月13日
KibanaでElasticsearchデータを可視化する(データビュー・Lens・ダッシュボードでNginxログを分析)
Kibana で Elasticsearch のデータを可視化するには、「データビューで対象のインデックスを指定する → Discover で中身を確かめる → Lens でグラフを作る → ダッシュボードにまとめる」の4段階で進めます。この記事では、Nginx のアクセスログが Elasticsearch に入っている状態を例に、Kibana の導入と接続から、ステータスコードの推移や重いページの一覧を作るところまでを説明します。Elasticsearch の導入とログの取り込みについては、それぞれの手順が済んでいることを前提にします。
手順1: Kibana を導入して Elasticsearch とつなぐ
Kibana は Elasticsearch と同じ公式リポジトリから入れられます。Elasticsearch と Kibana は同じ版を揃えるのが原則です。版がずれていると、起動時に互換性のエラーが出ます。
sudo apt-get install kibana
sudo systemctl daemon-reload
sudo systemctl enable --now kibana
8.0 以降の Elasticsearch は TLS と認証が有効なため、Kibana は「登録トークン(enrollment token)」を使ってつなぐのが簡単です。Elasticsearch のサーバーでトークンを発行し、Kibana 側で読み込みます。
# Elasticsearch 側: Kibana 用の登録トークンを発行(有効期限は短い)
sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
# Kibana 側: トークンを使って接続設定を書き込む
sudo /usr/share/kibana/bin/kibana-setup --enrollment-token <発行されたトークン>
sudo systemctl restart kibana
ブラウザーで画面を開いてトークンを貼り付ける方法もあり、その場合は Kibana のサーバーで kibana-verification-code を実行して表示される確認コードを入力します。接続が済んだら、elastic ユーザーでログインできます。
Kibana の待ち受けは、初期設定ではそのサーバー自身(localhost)の 5601 番だけです。リモートから見たい場合も、kibana.yml の server.host を広げてインターネットに直接公開するのではなく、Nginx のリバースプロキシで HTTPS を付け、接続元の IP 制限や VPN を組み合わせます。ログには IP アドレスや URL のクエリ文字列など個人に関わる情報が含まれることがあるため、閲覧できる人を絞ることは運用上の前提です。
手順2: データビューを作る
Kibana でデータを扱うには、まず「どのインデックスを、どの時刻フィールドで見るか」を決めるデータビューを作ります。以前は「インデックスパターン」と呼ばれていた設定で、8.0 で名前が変わりました。管理メニューの Kibana の項目、または Discover の画面から作成できます(メニューの位置は版によって変わります)。
- 名前: Nginx access
- インデックスパターン:
nginx-access-*(日付ごとに分かれたインデックスをまとめて対象にする) - タイムスタンプフィールド:
@timestamp
この記事では、Nginx のログを JSON 形式で出力し、status・path・method・request_time といったフィールド名で取り込んだ前提で説明します。フィールド名は取り込み方法で変わり、たとえば Fluentd の標準の nginx パーサーではステータスコードが code になります。自分の環境の名前に読み替えてください。
インデックスパターンを入力すると、右側に一致するインデックスが表示されます。何も表示されない場合は、ログがまだ取り込まれていないか、インデックス名が想定と違います。Elasticsearch の _cat/indices で実際の名前を確認します。
手順3: Discover で中身を確かめる
グラフを作る前に、Discover でデータが正しく入っているかを見ます。ここを飛ばすと、グラフが空になったときに原因がデータ側か設定側か分からなくなります。
画面右上の期間指定を「過去15分」などに合わせ、ログが流れているかを確認します。何も表示されないときに多い原因は次のとおりです。
- 期間が合っていない: 古いログを取り込んだ場合、既定の期間には入りません。期間を広げます。
- 時刻がずれている:
@timestampがタイムゾーンを考慮せずに取り込まれると、9時間前後ずれることがあります。ドキュメントの時刻と実際のアクセス時刻を見比べます。 - フィールドが分割されていない: ログの1行がまるごと
messageフィールドに入っていると、ステータスコードやパスで集計できません。取り込み側のパース設定を見直します。
Discover の検索欄では KQL(Kibana Query Language)が使えます。
status >= 500
path : "/wp-login.php" and method : "POST"
not status : 200 and path : /wp-admin*
ログイン画面への POST が集中している時間帯を探す、といった調査はこの段階でもできます。
手順4: Lens でグラフを作る
Lens は、フィールドをドラッグ&ドロップしてグラフを作るエディターです。可視化ライブラリやダッシュボードの画面から新しい可視化を作るときに選べます。Lens 以外にも従来型の作成方法が残っていますが、新しく作るなら Lens が基本です。
ステータスコード別のリクエスト数の推移
- データビューに Nginx access を選ぶ
- グラフの種類に「棒グラフ(積み上げ)」を選ぶ
- 横軸に
@timestamp、縦軸にレコード数(Count)を設定する - 内訳(Breakdown)に
statusを指定する
500 番台が急に増えた時間帯は、PHP のエラーやプラグイン更新の影響を疑う手がかりになります。
遅いページの一覧
- グラフの種類に「表」を選ぶ
- 行に
pathの上位10件を指定する - 指標に
request_time(応答時間のフィールド)の平均と、レコード数を追加する - 平均応答時間の降順で並べる
キャッシュの効いていないページや、重いクエリを含むページを見つけるのに役立ちます。応答時間を記録するには、Nginx のログ形式に $request_time を含めておく必要があります。
集計できないフィールドがある場合
Lens のフィールド一覧で、集計に使えないフィールドが出ることがあります。Elasticsearch では、文章として全文検索するための text 型は、そのままでは上位○件のような集計に使えません。集計には keyword 型(または数値型・日付型)が必要です。動的マッピングで取り込んだ文字列は path と path.keyword のように2つ作られることが多いので、集計には .keyword の付いた方を選びます。根本的には、取り込む前にインデックスのマッピングを決めておくのが確実な対処です。
手順5: ダッシュボードにまとめて共有する
作ったグラフはダッシュボードに並べます。ダッシュボードでは、期間指定とフィルターがすべてのパネルに一括でかかるため、「500 エラーが増えた時間帯に、どのページが遅かったか」を同じ画面でたどれます。
- 上段に全体の指標(リクエスト数、エラー率)、中段に推移のグラフ、下段に詳細の表、と上から下へ詳しくなる配置にすると読みやすくなります
- グラフの棒をクリックするとフィルターとして追加され、ほかのパネルも絞り込まれます
- よく使う絞り込み(例: 管理画面へのアクセスを除く)は、保存済みクエリにしておきます
ほかの人に見せる場合は、管理者の elastic ユーザーを共有せず、閲覧用のロールとユーザーを作ります。ロールには、対象インデックスの読み取り権限と、Kibana のダッシュボードの閲覧権限だけを付けます。用途ごとに「スペース」を分けると、部署やサイトごとにダッシュボードを整理できます。
ダッシュボードや可視化は、保存オブジェクトとして書き出しと取り込みができます。検証環境で作ったダッシュボードを本番の Kibana に移すときや、バックアップとして残すときに使います。
運用で気をつけたいこと
- 期間を長く取った重いダッシュボードは、Elasticsearch に負荷をかけます。日常の確認用は「過去24時間」程度にし、長期の傾向は別のダッシュボードに分けます。
- Kibana のアラート機能やレポート機能の一部は、利用できるライセンスの種類によって異なります(2026年10月現在)。使いたい機能があれば、Elastic の公式サイトの機能比較で確認してください。
- Kibana の版を上げるときは Elasticsearch と揃えて上げます。上げる前にダッシュボードを書き出しておくと、問題が起きたときに戻せます。
まとめ
- Kibana は Elasticsearch と同じ版を入れ、登録トークンでつなぐ。画面はインターネットに直接公開しない
- データビューで対象インデックスと時刻フィールドを決め、Discover でデータが正しく入っているかを先に確かめる
- 表示されないときは、期間・タイムゾーン・フィールドの分割の順に疑う
- グラフは Lens で作る。集計には
keyword型のフィールドを使う - ダッシュボードで期間とフィルターを一括でかけ、共有は閲覧専用のロールで行う