AI

ログ集約比較: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 LokiFluentdVector
ストレージコスト✅ 最安(S3圧縮)
スループット✅ 最速(Rust)
プラグイン数✅ 800+50+
Kubernetes統合✅ DaemonSet
GitHub Stars23k+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-chartshelm install alloy grafana/alloy -n monitoring --create-namespace --set-string 'controller.type=daemonset'②Alloyの設定でKubernetes Pod Logsを自動検出→Lokiに送信③Podのラベル(appnamespacepod)が自動的に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.yamlstorage_configでS3を設定→bucket: logs-bucketregion: autocompactor.retention_enabled: trueで古いログを自動削除→retention_period: 30d③ログレベルに応じてフィルタリング: fluentdgrepフィルターや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統合・K8sGrafana Loki
拡張性・プラグイン・大規模エンタープライズFluentd
超高速・低メモリ・ログ+メトリクス統合Vector

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。