ログ集約比較:Grafana Loki vs Fluentd vs Vector でログを管理する
オープンソースラボ編集部 ・ 2026年6月13日
ログ集約比較:Grafana Loki vs Fluentd vs Vector でログを管理する
マイクロサービス・コンテナ環境では数百台のサーバー・Pod から毎秒数万行のログが生成されます。ELK Stack(Elasticsearch + Logstash + Kibana)のように重量級ではなく、軽量・低コストなOSSログ管理スタックが注目されています。Grafana Loki(ラベルベース・低コスト)・Fluentd(CNCF卒業・最大シェア)・Vector(Rust製・超高速)の3つが2026年のデファクトスタンダードです。
OSSログ集約ツールを使う理由
- コスト削減: Datadog Logs($2.55/GB)・Splunk(高価格)→OSSで$20/月のS3 + Prometheusスタックのみ
- スケーラビリティ: Kubernetes + マイクロサービス環境での数千Podのログを統一管理
- デバッグ効率: 分散システムのリクエストトレースをログで追跡してMTTR(平均復旧時間)を短縮
- コンプライアンス: ログの保持期間・アクセス制御・暗号化を自社ポリシーで管理
主要ツールの概要
Grafana Loki
2018年公開(Grafana Labs)のOSSです。GitHubスター23k+。Prometheusのようにラベルベースでログを管理するログ集約システムで、ログの全文インデックス化をせず「メタデータラベルのみインデックス化+ログ本文は圧縮して安価なオブジェクトストレージ(S3/GCS)に保存」することでELKより大幅にコストを削減します。
# docker-compose.yml: Grafana Loki + Promtail + Grafana
version: "3.8"
services:
loki:
image: grafana/loki:3.3.0
restart: unless-stopped
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
volumes:
- loki_data:/loki
promtail:
image: grafana/promtail:3.3.0
restart: unless-stopped
volumes:
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- ./promtail-config.yaml:/etc/promtail/config.yaml
command: -config.file=/etc/promtail/config.yaml
grafana:
image: grafana/grafana:11.4.0
restart: unless-stopped
ports:
- "3000:3000"
environment:
GF_AUTH_ANONYMOUS_ENABLED: "true"
GF_AUTH_ANONYMOUS_ORG_ROLE: Viewer
volumes:
- grafana_data:/var/lib/grafana
volumes:
loki_data:
grafana_data:
# promtail-config.yaml: Docker コンテナのログを収集
server:
http_listen_port: 9080
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: docker-containers
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
- source_labels: [__meta_docker_container_name]
target_label: container
- source_labels: [__meta_docker_container_label_com_docker_compose_service]
target_label: service
pipeline_stages:
- json:
expressions:
level: level
msg: msg
ts: ts
- labels:
level:
- timestamp:
source: ts
format: RFC3339Nano
# Python: Loki HTTP APIにログをPUSHしてアラートルールを設定
import requests
import json
import time
LOKI_URL = 'http://localhost:3100'
def push_logs(labels: dict, log_lines: list[tuple[int, str]]):
'''Loki Push APIにログを直接送信(アプリからの直接送信)'''
streams = [{
'stream': labels,
'values': [[str(ts * 1_000_000_000), msg] for ts, msg in log_lines],
}]
resp = requests.post(f'{LOKI_URL}/loki/api/v1/push', json={'streams': streams})
resp.raise_for_status()
def query_logs(logql: str, start_ns: int = None, end_ns: int = None, limit: int = 100) -> list:
'''LogQLクエリでログを検索・集計'''
now = int(time.time())
params = {
'query': logql,
'start': str((start_ns or (now - 3600)) * 1_000_000_000),
'end': str((end_ns or now) * 1_000_000_000),
'limit': limit,
}
resp = requests.get(f'{LOKI_URL}/loki/api/v1/query_range', params=params)
return resp.json()['data']['result']
# 使用例
push_logs({'app': 'myapi', 'env': 'production', 'level': 'error'},
[(int(time.time()), 'データベース接続タイムアウト: host=db port=5432 timeout=30s')])
# LogQLクエリ例
# エラーログのみ取得
error_logs = query_logs('{app="myapi",level="error"} |= "timeout"')
# エラーレートの集計(メトリクス)
error_rate = query_logs('sum(rate({app="myapi"} |= "ERROR" [5m])) by (service)')
print(f'エラーログ件数: {len(error_logs)}')
Fluentd
2011年公開(Treasure Data)、Ruby製のOSSです。GitHubスター13k+。CNCF卒業プロジェクト。最大シェアのOSSログコレクターで、800+のプラグイン(Input・Output・Filter・Buffer)による超高い拡張性と、Kubernetes DaemonSetとしての安定した実績を持ちます。
# fluentd.conf: Dockerログを収集してLoki + Elasticsearch に送信
<source>
@type forward
port 24224
</source>
<filter docker.**>
@type parser
key_name log
reserve_data true
remove_key_name_field true
<parse>
@type json
time_key time
time_type string
time_format %Y-%m-%dT%H:%M:%S.%NZ
</parse>
</filter>
<match docker.**>
@type copy
<store>
@type loki
url http://loki:3100
<label>
container $.container_name
env production
</label>
flush_interval 1s
flush_at_shutdown true
</store>
</match>
Vector
2019年公開(Datadog買収)、Rust製のOSSです。GitHubスター18k+。超高速・低メモリのObservabilityデータパイプラインで、ログ・メトリクス・トレースを統一して処理します。ベンチマークでFluentdの10倍以上のスループット実績があります。
# vector.toml: Dockerログ収集 → Loki送信
[sources.docker]
type = "docker_logs"
docker_host = "unix:///var/run/docker.sock"
[transforms.parse_json]
type = "remap"
inputs = ["docker"]
source = '''
. = parse_json!(string!(.message)) ?? .
.timestamp = now()
'''
[sinks.loki]
type = "loki"
inputs = ["parse_json"]
endpoint = "http://loki:3100"
labels = {container = "{{ container_name }}", level = "{{ level }}"}
encoding.codec = "json"
機能比較表
| 比較項目 | Grafana Loki | Fluentd | Vector |
|---|---|---|---|
| ストレージコスト | ✅ 最安(S3圧縮) | 中 | 中 |
| スループット | 高 | 中 | ✅ 最速(Rust) |
| プラグイン数 | 少 | ✅ 800+ | 50+ |
| Kubernetes統合 | ✅ | ✅ DaemonSet | ✅ |
| GitHub Stars | 23k+ | 13k+ | 18k+ |
ログ集約はDevOpsカテゴリ/categories/devopsのGrafana・Prometheus・AlertManagerと組み合わせて「ログ→メトリクス→アラート→インシデント」の完全なオブザーバビリティスタックを構築します。セキュリティカテゴリ/categories/securityのWAFログ・認証ログ・アクセスログをLokiに集約してGrafana Alertingで不正アクセスを検知するセキュリティ監視基盤が多くの組織で採用されています。
FAQ
Q. Grafana LokiでKubernetesのPodログを自動収集するには?
A. HelmでGrafana Alloy(旧Promtail)をDaemonSetとしてデプロイします。①helm repo add grafana https://grafana.github.io/helm-charts→helm install alloy grafana/alloy -n monitoring --create-namespace --set-string 'controller.type=daemonset'②Alloyの設定でKubernetes Pod Logsを自動検出→Lokiに送信③Podのラベル(app・namespace・pod)が自動的にLokiのラベルにマッピング→LogQLで{namespace="production",app="myapi"}でフィルタリング可能。LogQL集計: count_over_time({namespace="production"} |= "ERROR" [1h])でエラー数をカウント→Grafana Alertingでしきい値超過時にSlack通知。
Q. VectorとFluentdの移行方法は?
A. Vector は Fluentd フォワードプロトコルを入力として受け付けるのでサイドカーとして段階的移行が可能です。移行手順: ①Fluentdのout_forwardプラグインの送信先をVectorに変更②VectorでFluentdから受け取ったデータをLoki/Elasticsearch等に送信③動作確認後にFluentdを撤廃→Vectorに完全移行。移行の利点: ①Rustのメモリ安全性によるメモリリーク問題の解消②CPU使用率が大幅に低下(Fluentd/Ruby比)③設定がTOML/YAMLで一元管理しやすい。注意点: Fluentdの複雑なプラグインチェーンはVectorのVector Remap Language(VRL)で書き直しが必要になる場合があります。
Q. Lokiのストレージコストを最小化するには?
A. S3互換ストレージ(MinIO・Wasabi・Cloudflare R2)を使い、保持期間とアーカイブルールを設定します。構成: ①loki-config.yamlのstorage_configでS3を設定→bucket: logs-bucket・region: auto②compactor.retention_enabled: trueで古いログを自動削除→retention_period: 30d③ログレベルに応じてフィルタリング: fluentdのgrepフィルターやVectorのfilter変換でDEBUGログを本番環境から除去→収集量を70%削減するケースも。コスト比較(月100GBの場合): Datadog Logs = $255/月 vs Loki + S3/R2 = $5〜$15/月。
Q. ログからAlertingを設定してSlackに通知するには?
A. GrafanaのAlerting機能でLokiクエリをルールとして設定してSlack通知を実装します。手順: ①Grafana→Alerting→Alert rules→New alert rule②Data source: Loki③LogQLクエリ: sum(count_over_time({app="myapi"} |= "CRITICAL" [5m])) > 5(5分間でCRITICALログが5件超)④Evaluation interval: 1m・Pending period: 0s⑤Contact points→Slack webhookURLを設定→{{ $labels.app }}でエラー多発: {{ $values.A }}件/5分のメッセージテンプレート⑥Notification policies→matchers: severity=critical→Slackチャンネル紐付け。Alertmanager統合: Grafana Alert をPrometheus Alertmanagerに送ることでPagerDuty・OpsGenieなどとも連携できます。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| 低コスト・Grafana統合・K8s | Grafana Loki |
| 拡張性・プラグイン・大規模エンタープライズ | Fluentd |
| 超高速・低メモリ・ログ+メトリクス統合 | Vector |