ELKスタックとFilebeatの概要
ELKスタックは、Elasticsearch、Logstash、Kibanaの3つオープンソースソフトウェアを組み合わせたログ管理基盤です。近年では、軽量なデータシッパーであるBeatsファミリー(Filebeat、Metricbeatなど)が加わり、ログ収集の効率性がさらに向上しています。
- Elasticsearch: 分散型のRESTful検索・分析エンジンであり、データの保存、検索、大量のデータに対するリアルタイムな分析を提供します。
- Logstash: サーバーサイドのデータ処理パイプラインであり、複数のソースから同時にデータを取得し、変換してから「ステッシュ(stash)」と呼ばれる出力先(通常はElasticsearch)へ送信します。
- Kibana: Elasticsearch上のデータを視覚化し、ナビゲーションを行うためのWebインターフェースを提供します。
- Filebeat: Go言語で記述された軽量なログ転送エージェントです。各サーバーにインストールし、ログファイルを監視してLogstashやElasticsearchへ転送する役割を担います。
Filebeatのアーキテクチャ
Filebeatは主に「Harvester(ハーベスター)」と「Prospector(プロスペクター)」という2つのコンポーネントで構成されています。
- Prospector(プロスペクター): ソース(ログファイルなど)を見つけ出し、各ソースに対してHarvesterを起動する役割を持ちます。設定ファイルで定義されたパスパターンに基づいてファイルを監視し、Goルーチン上で動作します。
- Harvester(ハーベスター): 個別のファイルを1行ずつ読み取り、その内容を出力先へ送信します。ファイルを開いている間はファイル記述子を保持し続けるため、ファイルが削除または名前変更されても、Harvesterは読み取りを継続します。
Filebeatは「At least once(少なくとも1回)」の転送を保証する信頼性の高い設計になっており、ログの切り捨て(Truncate)やローテーションなどの一般的な問題に対処する機能を備えています。
Filebeatのインストール
ここでは、Linux環境への導入例を解説します。公式サイトや各種ミラーサイトからアーカイブファイルをダウンロードして展開します。
# アーカイブのダウンロード(例)
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.5.0-linux-x86_64.tar.gz
# 展開
tar -xvf filebeat-8.5.0-linux-x86_64.tar.gz
# ディレクトリの移動とリネーム
mv filebeat-8.5.0-linux-x86_64 /usr/local/filebeat
基本設定とログ収集
Filebeatの設定はYAML形式で記述します。主な設定項目は入力源を定義するfilebeat.inputsと、出力先を定義するoutput.*です。
入力設定 (Inputs)
最も一般的なログタイプの入力設定例です。収集するパスの指定や、マルチラインログ(Javaのスタックトレースなど)の扱い方を定義します。
filebeat.inputs:
- type: log
enabled: true
# 収集対象のファイルパス
paths:
- /var/log/app/*.log
# マルチラインの設定
# 空白または'Caused by:'で始まる行を前の行に結合する
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
multiline.negate: false
multiline.match: after
# 任意のフィールド追加
fields:
environment: production
app_type: web_server
複数のディレクトリを異なる条件で収集したい場合、入力ブロックを追加することで対応可能です。また、追加したフィールド(例:fields.environment)を用いて、後続のLogstashやElasticsearchでのフィルタリング条件に利用できます。
出力設定 (Outputs)
収集したデータの送信先を設定します。主にElasticsearchまたはLogstashを指定します。
Elasticsearchへ直接出力する場合:
output.elasticsearch:
hosts: ["http://192.168.1.10:9200"]
# インデックス名の指定(オプション)
index: "app-logs-%{+yyyy.MM.dd}"
# ILM(Index Lifecycle Management)の無効化(必要に応じて)
setup.ilm.enabled: false
Logstashを経由して出力する場合:
output.logstash:
hosts: ["192.168.1.20:5044"]
設定のテストと実行
設定ファイルを作成したら、起動前に構文チェックを行い、その後実行します。
# 設定ファイルのテスト (config.yml を作成したと仮定)
./filebeat test config -c config.yml
# フォアグラウンドで実行
./filebeat -e -c config.yml
# バックグラウンドで実行
nohup ./filebeat -c config.yml > /dev/null 2>&1 &
JSON形式のログ解析
アプリケーションログがJSON形式で出力されている場合、Filebeatはその構造を維持したまま解析・転送できます。以下に、JSONログを読み込み、Elasticsearchへインデックス化する設定例を示します。
1. Filebeat設定ファイル (json_config.yml)
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/app/events.json
# JSON解析の設定
json.keys_under_root: true
json.add_error_key: true
json.message_key: message
output.elasticsearch:
hosts: ["http://127.0.0.1:9200"]
index: "json-events"
setup.ilm.enabled: false
setup.template.name: "json-events"
setup.template.pattern: "json-events"
2. インデックステンプレートの作成 (Kibana Dev Tools等で実行)
データ型を明確に定義するため、事前にマッピングを設定します。
PUT json-events
{
"mappings": {
"properties": {
"timestamp": { "type": "date" },
"service_name": { "type": "keyword" },
"event_id": { "type": "long" },
"status": { "type": "keyword" },
"payload": { "type": "text" }
}
}
}
3. サンプルJSONデータの作成
ログファイル(/var/log/app/events.json)に以下のようなデータを書き込みます。
{"service_name": "order-service", "event_id": 101, "status": "success", "payload": "Order created"}
{"service_name": "auth-service", "event_id": 202, "status": "failed", "payload": "Invalid token"}
{"service_name": "payment-service", "event_id": 305, "status": "success", "payload": "Transaction ID: xyz-999"}
4. Filebeatの実行と確認
設定ファイルを指定してFilebeatを起動し、Kibanaでデータが正しくインデックスされているかを確認します。
./filebeat -e -c json_config.yml