Filebeatを使用したNew Relicログ統合 - 軽量で効率的なログ転送の実装

Filebeatは、Elastic Beatsファミリーの軽量ログシッパーとして、最小限のリソース使用量で効率的なログ収集を実現します。New Relicとの統合により、既存のElastic Stackインフラストラクチャを活用しながら、包括的なログ監視を構築できます。本記事では、FilebeatからNew Relicへのログ統合の詳細な実装方法と、大規模環境での最適化手法について解説します。

Filebeatとは

Filebeatは、Goで開発された軽量なログ収集エージェントです。ファイルシステムの変更を監視し、新しいログエントリを効率的に収集して、様々な出力先に転送します。低いメモリフットプリントと高い信頼性により、本番環境での使用に適しています。

Filebeatのアーキテクチャ

Filebeatのアーキテクチャは、シンプルながら強力な設計となっています。

**Harvester(ハーベスター)**は、個々のファイルを監視し、新しい行が追加されるたびにイベントを生成します。各ファイルに対して1つのHarvesterが起動し、ファイルの状態を追跡します。

**Spooler(スプーラー)**は、Harvesterから受信したイベントをバッファリングし、バッチ処理で出力先に送信します。これにより、ネットワーク効率とスループットが最適化されます。

**Output(出力)**モジュールは、処理されたログデータを最終的な出力先に送信します。Elasticsearch、Logstash、Kafka、そしてHTTP出力など、様々な出力方式をサポートします。

**Registry(レジストリ)**は、ファイルの読み取り位置やメタデータを永続化し、Filebeat再起動時のデータ損失を防ぎます。

New Relic統合の設定

FilebeatからNew Relicにログデータを送信するには、HTTP出力プラグインを使用してNew Relic Logs APIに直接送信します。

基本設定の実装

最も基本的な設定から始めましょう。

yaml
# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/app/*.log
  fields:
    service: myapp
    environment: production
  fields_under_root: true

output.http:
  hosts: ["https://log-api.newrelic.com"]
  protocol: "https"
  path: "/log/v1"
  headers:
    Content-Type: "application/json"
    X-License-Key: "${NEW_RELIC_LICENSE_KEY}"
  
processors:
- add_host_metadata:
    when.not.contains.tags: forwarded

この設定では、アプリケーションログファイルを監視し、必要なメタデータを付与してNew Relicに送信します。

複数入力ソースの設定

実際の環境では、複数のログソースからデータを収集する必要があります。

yaml
filebeat.inputs:
# アプリケーションログ
- type: log
  enabled: true
  paths:
    - /var/log/app/*.log
  json.keys_under_root: true
  json.add_error_key: true
  fields:
    service: webapp
    logtype: application
    environment: production

# Nginxアクセスログ
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  fields:
    service: nginx
    logtype: access
    environment: production

# システムログ
- type: log
  enabled: true
  paths:
    - /var/log/syslog
  fields:
    service: system
    logtype: syslog
    environment: production

# Dockerコンテナログ
- type: container
  enabled: true
  paths:
    - '/var/lib/docker/containers/*/*.log'
  processors:
  - add_docker_metadata:
      host: "unix:///var/run/docker.sock"

高度なデータ処理

Filebeatには強力なプロセッサー機能があり、ログデータの変換と エンリッチメントを行えます。

プロセッサーチェーンの設定

yaml
processors:
# ホストメタデータの追加
- add_host_metadata:
    when.not.contains.tags: forwarded
    netinfo.enabled: false
    cache.ttl: 5m

# Dockerメタデータの追加
- add_docker_metadata:
    host: "unix:///var/run/docker.sock"
    match_fields: ["container.id"]

# Kubernetesメタデータの追加(K8s環境の場合)
- add_kubernetes_metadata:
    host: ${NODE_NAME}
    matchers:
    - logs_path:
        logs_path: "/var/log/containers/"

# フィールドのドロップ
- drop_fields:
    fields: ["ecs", "agent", "input", "log.file"]

# フィールドの名前変更
- rename:
    fields:
    - from: "container.name"
      to: "service_name"
    ignore_missing: true

# 条件付きフィールド追加
- add_fields:
    target: ""
    fields:
      datacenter: "us-east-1"
      team: "platform"
    when:
      equals:
        service: webapp

# タイムスタンプの解析
- timestamp:
    field: "timestamp"
    layouts:
      - '2006-01-02T15:04:05Z'
      - '2006-01-02T15:04:05.999Z'
    test:
      - '2025-07-27T10:00:00Z'

条件付き処理

ログの内容に応じて異なる処理を適用できます。

yaml
processors:
# エラーログの特別処理
- add_fields:
    target: ""
    fields:
      priority: "high"
      alert_required: true
    when:
      or:
        - contains:
            message: "ERROR"
        - contains:
            message: "FATAL"

# セキュリティログの分類
- add_fields:
    target: ""
    fields:
      category: "security"
      requires_review: true
    when:
      or:
        - contains:
            message: "authentication failed"
        - contains:
            message: "unauthorized access"

# 不要なデバッグログの除外
- drop_event:
    when:
      and:
        - equals:
            log.level: "DEBUG"
        - equals:
            environment: "production"

パフォーマンス最適化

大量のログデータを処理する環境では、Filebeatのパフォーマンス最適化が重要です。

バッファリングと出力設定

yaml
output.http:
  hosts: ["https://log-api.newrelic.com"]
  protocol: "https"
  path: "/log/v1"
  headers:
    Content-Type: "application/json"
    X-License-Key: "${NEW_RELIC_LICENSE_KEY}"
  
  # バッチ設定
  bulk_max_size: 1000
  flush_bytes: 10485760  # 10MB
  flush_interval: 10s
  
  # 接続設定
  worker: 4
  connection_idle_timeout: 30s
  
  # 再試行設定
  backoff.init: 1s
  backoff.max: 60s
  max_retries: 3

# メモリキューの設定
queue.mem:
  events: 8192
  flush.min_events: 1024
  flush.timeout: 5s

ハーベスター設定の最適化

yaml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/app/*.log
  
  # ハーベスター設定
  harvester_buffer_size: 16384
  max_bytes: 10485760
  
  # ファイル監視設定
  scan_frequency: 10s
  ignore_older: 24h
  close_inactive: 10m
  close_removed: true
  close_renamed: false
  
  # マルチライン処理
  multiline.pattern: '^\d{4}-\d{2}-\d{2}'
  multiline.negate: true
  multiline.match: after

Kubernetes環境での展開

Kubernetes環境では、DaemonSetとしてFilebeatを展開し、全ノードのログを収集できます。

DaemonSet設定

yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat-newrelic
  namespace: kube-system
  labels:
    app: filebeat-newrelic
spec:
  selector:
    matchLabels:
      app: filebeat-newrelic
  template:
    metadata:
      labels:
        app: filebeat-newrelic
    spec:
      serviceAccountName: filebeat
      terminationGracePeriodSeconds: 30
      containers:
      - name: filebeat
        image: docker.elastic.co/beats/filebeat:8.9.0
        args: [
          "-c", "/etc/filebeat.yml",
          "-e",
        ]
        env:
        - name: NEW_RELIC_LICENSE_KEY
          valueFrom:
            secretKeyRef:
              name: newrelic-secret
              key: license-key
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        securityContext:
          runAsUser: 0
        resources:
          limits:
            memory: 200Mi
            cpu: 100m
          requests:
            memory: 100Mi
            cpu: 50m
        volumeMounts:
        - name: config
          mountPath: /etc/filebeat.yml
          readOnly: true
          subPath: filebeat.yml
        - name: data
          mountPath: /usr/share/filebeat/data
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: varlog
          mountPath: /var/log
          readOnly: true
      volumes:
      - name: config
        configMap:
          defaultMode: 0600
          name: filebeat-config
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: varlog
        hostPath:
          path: /var/log
      - name: data
        hostPath:
          path: /var/lib/filebeat-data
          type: DirectoryOrCreate

ConfigMapでの設定管理

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
  namespace: kube-system
data:
  filebeat.yml: |-
    filebeat.inputs:
    - type: container
      paths:
        - /var/log/containers/*.log
      processors:
        - add_kubernetes_metadata:
            host: ${NODE_NAME}
            matchers:
            - logs_path:
                logs_path: "/var/log/containers/"
        - drop_fields:
            fields: ["host", "agent", "ecs", "log", "prospector", "input", "beat"]
    
    output.http:
      hosts: ["https://log-api.newrelic.com"]
      protocol: "https"
      path: "/log/v1"
      headers:
        Content-Type: "application/json"
        X-License-Key: "${NEW_RELIC_LICENSE_KEY}"
      bulk_max_size: 1000
      
    logging.level: info
    logging.to_files: true
    logging.files:
      path: /var/log/filebeat
      name: filebeat
      keepfiles: 7
      permissions: 0644

監視とトラブルシューティング

Filebeat自体の監視とトラブルシューティング手法について説明します。

メトリクス監視の設定

yaml
# filebeat.yml内のモニタリング設定
http.enabled: true
http.host: "0.0.0.0"
http.port: 5066

monitoring:
  enabled: true
  
logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat.log
  keepfiles: 7
  permissions: 0644

メトリクス情報をNew Relicに送信する別のFilebeatインスタンスの設定例です。

yaml
# filebeat-monitoring.yml
filebeat.inputs:
- type: httpjson
  enabled: true
  interval: 60s
  url: "http://localhost:5066/stats"
  json_objects_array: false
  processors:
  - add_fields:
      target: ""
      fields:
        service: "filebeat-monitoring"
        metric_type: "filebeat_stats"

output.http:
  hosts: ["https://log-api.newrelic.com"]
  protocol: "https"
  path: "/log/v1"
  headers:
    Content-Type: "application/json"
    X-License-Key: "${NEW_RELIC_LICENSE_KEY}"

一般的な問題と解決方法

メモリ使用量の増加については、キュー設定とハーベスター数の調整が有効です。

yaml
# メモリ使用量の制御
filebeat.inputs:
- type: log
  max_procs: 2  # ハーベスター数の制限

queue.mem:
  events: 4096  # キューサイズの削減

ファイル権限の問題では、適切なユーザー権限とSELinux設定が必要です。

bash
# ファイル権限の確認
ls -la /var/log/
getfacl /var/log/app/

# SELinux設定(CentOS/RHEL)
setsebool -P rsyslog_can_sendmail on

レジストリファイルの破損については、レジストリファイルの削除と再作成が有効です。

bash
# レジストリファイルの場所確認
find /var/lib/filebeat -name "registry"

# レジストリファイルの削除(慎重に実行)
rm -rf /var/lib/filebeat/registry

セキュリティとコンプライアンス

本番環境でのFilebeat運用におけるセキュリティベストプラクティスを説明します。

認証情報の保護

環境変数を使用してライセンスキーを保護します。

bash
# 環境変数での設定
export NEW_RELIC_LICENSE_KEY="your_license_key_here"

# systemdサービスでの設定
sudo systemctl edit filebeat
ini
[Service]
Environment="NEW_RELIC_LICENSE_KEY=your_license_key_here"

ネットワークセキュリティ

TLS設定とプロキシ設定の例です。

yaml
output.http:
  hosts: ["https://log-api.newrelic.com"]
  
  # 強化されたTLS設定
  ssl.verification_mode: full
  ssl.certificate_authorities: ["/etc/ssl/certs/ca-certificates.crt"]
  ssl.cipher_suites: ["TLS_AES_128_GCM_SHA256", "TLS_AES_256_GCM_SHA384", "TLS_CHACHA20_POLY1305_SHA256"]
  ssl.supported_protocols: ["TLSv1.2", "TLSv1.3"]
  ssl.curve_types: ["P-256", "P-384"]
  
  # プロキシ設定
  proxy_url: "http://proxy.company.com:8080"
  
  # タイムアウト設定
  timeout: 60s
  
  # 接続セキュリティ
  headers:
    User-Agent: "Filebeat/8.9.0"
  compression_level: 1

ログデータのサニタイゼーション

機密情報をマスキングまたは除去します。

yaml
processors:
# 機密情報のマスキング
- script:
    lang: javascript
    id: mask_sensitive_data
    source: >
      function process(event) {
        var message = event.Get("message");
        if (message) {
          // クレジットカード番号のマスキング
          message = message.replace(/\d{4}-\d{4}-\d{4}-\d{4}/g, "****-****-****-****");
          // SSNのマスキング
          message = message.replace(/\d{3}-\d{2}-\d{4}/g, "***-**-****");
          event.Put("message", message);
        }
      }

# フィールドの除去
- drop_fields:
    fields: ["password", "token", "api_key"]

コスト最適化戦略

大規模環境でのログ管理コストを効率的に制御するための戦略について説明します。

ログ量削減のサンプリング戦略

yaml
processors:
# 高頻度ログのサンプリング
- script:
    lang: javascript
    id: sampling_strategy
    source: >
      function process(event) {
        var logLevel = event.Get("log.level");
        var service = event.Get("service");
        
        // 本番環境でのDEBUGログを90%サンプリング
        if (logLevel === "DEBUG" && service === "production") {
          if (Math.random() > 0.1) {
            event.Cancel();
          }
        }
        
        // 高頻度アクセスログを50%サンプリング
        if (event.Get("message").includes("GET /health")) {
          if (Math.random() > 0.5) {
            event.Cancel();
          }
        }
      }

# 重要度別ログレベル設定
- add_fields:
    target: ""
    fields:
      retention_policy: "short"
    when:
      equals:
        log.level: "DEBUG"

- add_fields:
    target: ""
    fields:
      retention_policy: "standard"
    when:
      or:
        - equals:
            log.level: "INFO"
        - equals:
            log.level: "WARN"

- add_fields:
    target: ""
    fields:
      retention_policy: "long"
    when:
      or:
        - equals:
            log.level: "ERROR"
        - equals:
            log.level: "FATAL"

保存期間の最適化手法

yaml
processors:
# ログカテゴリ別の保存期間設定
- add_fields:
    target: ""
    fields:
      data_retention_days: 7
    when:
      and:
        - equals:
            log.level: "DEBUG"
        - equals:
            environment: "development"

- add_fields:
    target: ""
    fields:
      data_retention_days: 30
    when:
      or:
        - equals:
            logtype: "access"
        - equals:
            log.level: "INFO"

- add_fields:
    target: ""
    fields:
      data_retention_days: 90
    when:
      or:
        - equals:
            log.level: "ERROR"
        - equals:
            category: "security"
        - equals:
            logtype: "audit"

効率的なバッチ処理設定

yaml
output.http:
  # コスト効率を考慮したバッチ設定
  bulk_max_size: 2000  # バッチサイズを大きくしてAPI呼び出し回数削減
  flush_bytes: 20971520  # 20MB
  flush_interval: 30s    # フラッシュ間隔を延長してネットワーク効率向上
  
  # 圧縮を有効にしてデータ転送量削減
  compression_level: 6
  
  # 失敗時の効率的な再試行
  backoff.init: 2s
  backoff.max: 300s
  max_retries: 5

運用監視の拡充

ログ転送エージェントのヘルスチェック

yaml
# filebeat-health-monitor.yml
filebeat.inputs:
- type: httpjson
  interval: 30s
  url: "http://localhost:5066/stats"
  processors:
  - script:
      lang: javascript
      id: health_check
      source: >
        function process(event) {
          var stats = event.Get();
          var memoryUsage = stats.memstats.memory_alloc;
          var eventsPublished = stats.filebeat.events.published;
          
          // メモリ使用量のチェック(200MB超過時にアラート)
          if (memoryUsage > 209715200) {
            event.Put("alert_type", "high_memory_usage");
            event.Put("severity", "warning");
          }
          
          // イベント公開の停止チェック
          var lastCheck = event.Get("last_events_count") || 0;
          if (eventsPublished === lastCheck) {
            event.Put("alert_type", "events_stalled");
            event.Put("severity", "critical");
          }
          event.Put("last_events_count", eventsPublished);
        }

output.http:
  hosts: ["https://log-api.newrelic.com"]
  path: "/log/v1"
  headers:
    Content-Type: "application/json"
    X-License-Key: "${NEW_RELIC_LICENSE_KEY}"

パフォーマンスメトリクスの監視設定

yaml
# filebeat.yml内の監視設定拡張
processors:
- add_fields:
    target: "monitoring"
    fields:
      harvester_count: "${HARVESTER_COUNT:0}"
      queue_size: "${QUEUE_SIZE:0}"
      cpu_usage: "${CPU_USAGE:0}"
    when:
      contains:
        tags: "monitoring"

# パフォーマンス閾値の監視
- script:
    lang: javascript
    id: performance_monitoring
    source: >
      function process(event) {
        var queueSize = event.Get("monitoring.queue_size");
        var cpuUsage = event.Get("monitoring.cpu_usage");
        
        // キューサイズの監視(80%超過時にアラート)
        if (queueSize > 6553) {  // 8192 * 0.8
          event.Put("performance_alert", "high_queue_usage");
        }
        
        // CPU使用率の監視(70%超過時にアラート)
        if (cpuUsage > 70) {
          event.Put("performance_alert", "high_cpu_usage");
        }
        
        // ディスク使用量の推定監視
        var logFileSize = event.Get("log.file.size") || 0;
        if (logFileSize > 1073741824) {  // 1GB
          event.Put("performance_alert", "large_log_file");
        }
      }

まとめ

FilebeatとNew Relicの統合により、軽量で効率的なログ収集システムを構築できます。最小限のリソース使用量で大量のログデータを処理し、包括的な監視を実現できます。

コスト最適化戦略として、サンプリング設定、保存期間の最適化、効率的なバッチ処理により、大規模環境でも経済的なログ管理が可能です。運用監視の拡充により、ログ転送エージェントの健全性とパフォーマンスを継続的に監視し、安定した運用を実現できます。

Kubernetes環境での展開やプロセッサーを活用した高度なデータ処理により、複雑な要件にも対応可能です。適切なセキュリティ設定と監視により、安全で信頼性の高いログ管理システムを構築できます。

次のステップとして、New RelicのLogs in Context機能の設定について学んでいきましょう。APMデータとログデータの自動的な関連付けにより、問題の根本原因分析を大幅に向上させる手法を詳しく解説していきます。


関連記事: New Relic Logs in Context設定ガイド関連記事: Logstashを使用したNew Relicログ統合