1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Observabilityへの道⑦】全部ログを集めるな。Lokiで“使えるログ監視”を作る

1
Last updated at Posted at 2026-03-29

はじめに

ログは「集めるだけ」では意味がありません。
使える状態にして、初めて価値になります。

前回までで、Minecraft Bedrock サーバに対して

  • メトリクス監視
  • 外形監視

を進めてきました。

ここまでで「動いているか」「使えるか」は見えるようになりましたが、
“なぜそうなっているのか”はまだ分かりません。

そこで今回はログ監視を追加し、

  • 何が起きているのか
  • なぜその状態なのか

ログがあることで、「なぜ?」に答えられるようにします。

Loki + Promtail + Grafana を使い、
すべてを拾うのではなく、必要なログだけを拾う構成を目指します。
Prometheusと同じ思想で扱える点で、Lokiを選定しました。

ゴールは以下です。

  • Docker 環境でログ収集基盤を構築する
  • 必要なログのみを可視化する
  • “使えるログ監視”を実現する

Observabilityへの道シリーズ

このシリーズでは、監視スタックを段階的に構築しながら「見える化」から「使える監視」へと進めていきます。

これまでに以下の内容を扱ってきました。

1.Prometheusでメトリクス監視を構築
https://qiita.com/KanshiKun/items/1176246d27e52be652eb

2.AlertmanagerでSlack通知
https://qiita.com/KanshiKun/items/c56754fa6baaffec5de0

3.Grafanaでメトリクス可視化
https://qiita.com/KanshiKun/items/5979d2aaed5221ce0a1e

4.Minecraftサーバ監視
https://qiita.com/KanshiKun/items/65446702d765ec580d7a

5.Mincraftサーバの障害を定義(アラートルール作成)
https://qiita.com/KanshiKun/items/8f8239b65639e9d3c749

6.AWSを監視拠点にした外形監視の実装
https://qiita.com/drafts/5002eb89d4019ed96ccc/edit

7.Loki × Promtail × Grafanaでログを可視化する
https://qiita.com/KanshiKun/items/4b768d00433d1b5f700b

8.ログから監視を設計する 〜「何が起きているか」を捉える〜
https://qiita.com/drafts/6642323ec0b45368e932/edit


構成

今回使うのは以下の3つです。

  • Loki: ログの保存
  • Promtail: ログの収集
  • Grafana: 可視化

自宅サーバ構成(ログ)).jpg


前提

今回は以下の前提で進めます。

  • Docker / Docker Compose が利用できる
  • Minecraft Bedrock サーバが Docker で動いている
  • Grafana が利用できる

ディレクトリ構成

~/monitoring/prometheus/
├── docker-compose.yml
├── loki-config.yaml
└── promtail-config.yml

docker-compose.yml

まずは docker-compose.yml を作成します。

services:
  loki:
    image: grafana/loki:latest
    container_name: loki
    command:
      - "-config.file=/etc/loki/config.yaml"
    volumes:
      - ./loki-config.yaml:/etc/loki/config.yaml:ro
      - loki-data:/loki
    ports:
      - "3100:3100"
    restart: unless-stopped

  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    command:
      - "-config.file=/etc/promtail/config.yml"
    volumes:
      - ./promtail-config.yml:/etc/promtail/config.yml:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - promtail-positions:/tmp
    depends_on:
      - loki
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
    restart: unless-stopped
    depends_on:
      - loki

volumes:
  grafana-data:
  loki-data:
  promtail-positions:

Loki設定

次に loki-config.yaml を作成します。

auth_enabled: false

server:
  http_listen_port: 3100

common:
  path_prefix: /loki
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2024-01-01
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

storage_config:
  filesystem:
    directory: /loki/chunks

Lokiの役割(ログの保存)

Loki はログを受け取り、保存する役割を持ちます。

設定ファイルでは主に以下を定義しています。

  • server
    → Loki が待ち受けるポート

  • storage_config
    → ログの保存先(今回はローカル)

  • schema_config
    → ログのインデックス構造

今回の構成では、
「受け取ったログをローカルに保存する」
最小構成としています。


Promtail設定

次に promtail-config.yml を作成します。

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:
  - job_name: docker

    docker_sd_configs:
      - host: unix:///var/run/docker.sock
        refresh_interval: 5s

    relabel_configs:
      - source_labels: ['__meta_docker_container_name']
        regex: '/(.*)'
        target_label: container

      - source_labels: ['__meta_docker_container_id']
        target_label: container_id

      - source_labels: ['__meta_docker_container_image']
        target_label: image

    pipeline_stages:
      - docker: {}

Promtailの役割(ログの収集)

Promtail はログを収集し、Loki に送信する役割を持ちます。

設定ファイルでは以下を定義しています。

  • clients
    → 送信先(LokiのURL)

  • positions
    → どこまでログを読んだかの記録

  • scrape_configs
    → どのログを収集するか

最初は static_configs でログファイルを直接読む方法も試しましたが、
コンテナ単位で扱えるように docker_sd_configs を採用しました。

これにより、Grafana 側で

  • container="mc-bedrock"

のようにコンテナ単位でログを絞り込めるようになります。


起動

ファイルを配置したら起動します。

docker compose up -d

コンテナ確認

docker ps

以下のコンテナが起動していればOKです。

  • loki
  • promtail
  • grafana

Promtailログ確認

起動直後は Promtail のログも確認しておきます。

docker logs promtail --tail 50

ハマりポイント: timestamp too old

初回起動時、以下のようなエラーが出ることがありました。

has timestamp too old

これは Minecraft サーバの異常ではなく、
Promtail が古い Docker ログを Loki に送信しようとして拒否されたものです。

つまり、

  • 監視対象のエラーではない
  • ログ収集基盤の初回取り込み時のエラー

です。

この切り分けは重要で、
監視対象と監視基盤の問題は分けて考える必要があります。


GrafanaでLokiを追加

Grafana にアクセスします。

http://<サーバIP>:3000

ログイン後、

  • Connections
  • Data sources
  • Add new data source

から Loki を追加します。
image.png

URL は以下です。

http://loki:3100

Exploreでログ確認

Grafana の Explore 画面で、データソースに Loki を選択し、
以下のクエリを実行します。

{job="docker"}

ログが表示されれば収集成功です。
image.png


補足

Promtail は現在非推奨となっており、
今後は Grafana Alloy への移行が推奨されています。

ただし、ログ収集の流れを理解するという観点では
Promtail はシンプルで扱いやすく、学習用途としては有効でした。


まとめ

今回は、

  • Docker で Loki / Promtail / Grafana を構築
  • mc-bedrock のログを収集
  • Grafana で可視化

までを実施しました。

これにより、

  • メトリクス
  • 外形
  • ログ

の3つが揃い、
観測の土台が整ってきました。


次回

次は、

ログ監視設計(何を検知するか / どこまで通知するか)

を整理していきます。


ログ監視を追加して変わったこと

ログ監視を追加したことで、以下が分かるようになりました。

  • 外形監視がNGになったときに、原因をログから追える
  • サーバは生きているが「使えない」状態を把握できる
  • 事象の裏付けが取れるため、切り分けが早くなる

メトリクスは「兆候」、外形監視は「結果」、
ログは「事実」です。

この3つを組み合わせることで、
初めて“判断できる監視”になります。

ログ監視は「全部集めること」ではなく、
“判断に必要な情報だけを拾うこと”が重要だと感じました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?