ELKスタックにおけるFilebeatの導入と実践的な設定手法

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

タグ: Elasticsearch filebeat Logstash Kibana json-logging

7月26日 16:54 投稿