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に直接送信します。
基本設定の実装
最も基本的な設定から始めましょう。
# 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に送信します。
複数入力ソースの設定
実際の環境では、複数のログソースからデータを収集する必要があります。
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には強力なプロセッサー機能があり、ログデータの変換と エンリッチメントを行えます。
プロセッサーチェーンの設定
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'
条件付き処理
ログの内容に応じて異なる処理を適用できます。
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のパフォーマンス最適化が重要です。
バッファリングと出力設定
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
ハーベスター設定の最適化
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設定
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での設定管理
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自体の監視とトラブルシューティング手法について説明します。
メトリクス監視の設定
# 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インスタンスの設定例です。
# 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}"
一般的な問題と解決方法
メモリ使用量の増加については、キュー設定とハーベスター数の調整が有効です。
# メモリ使用量の制御
filebeat.inputs:
- type: log
max_procs: 2 # ハーベスター数の制限
queue.mem:
events: 4096 # キューサイズの削減
ファイル権限の問題では、適切なユーザー権限とSELinux設定が必要です。
# ファイル権限の確認
ls -la /var/log/
getfacl /var/log/app/
# SELinux設定(CentOS/RHEL)
setsebool -P rsyslog_can_sendmail on
レジストリファイルの破損については、レジストリファイルの削除と再作成が有効です。
# レジストリファイルの場所確認
find /var/lib/filebeat -name "registry"
# レジストリファイルの削除(慎重に実行)
rm -rf /var/lib/filebeat/registry
セキュリティとコンプライアンス
本番環境でのFilebeat運用におけるセキュリティベストプラクティスを説明します。
認証情報の保護
環境変数を使用してライセンスキーを保護します。
# 環境変数での設定
export NEW_RELIC_LICENSE_KEY="your_license_key_here"
# systemdサービスでの設定
sudo systemctl edit filebeat
[Service]
Environment="NEW_RELIC_LICENSE_KEY=your_license_key_here"
ネットワークセキュリティ
TLS設定とプロキシ設定の例です。
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
ログデータのサニタイゼーション
機密情報をマスキングまたは除去します。
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"]
コスト最適化戦略
大規模環境でのログ管理コストを効率的に制御するための戦略について説明します。
ログ量削減のサンプリング戦略
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"
保存期間の最適化手法
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"
効率的なバッチ処理設定
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
運用監視の拡充
ログ転送エージェントのヘルスチェック
# 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}"
パフォーマンスメトリクスの監視設定
# 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ログ統合