Paket 2 · Praktik LanjutanModul G — Monitoring, Logging & Observability

Centralized Logging, Loki & Alerting

Mengumpulkan log terpusat dengan Loki dan Promtail, query LogQL, merancang label, dan mengirim alert yang tidak berisik.

Log tersebar di banyak server sulit dianalisis. Centralized logging mengumpulkan log ke satu tempat; Loki menyimpan log dengan biaya relatif rendah dan terintegrasi dengan Grafana.

Mengapa log terpusat?

  • Mencari error lintas server.
  • Menghubungkan log dengan metrik dan trace.
  • Menjaga log tetap ada saat server rusak.
  • Audit dan kepatuhan.
  • Mempercepat troubleshooting.

Arsitektur Loki

App / system logs
   │
   ▼
Promtail / Grafana Alloy ──push──▶ Loki ──query──▶ Grafana

Loki mengindeks label, bukan seluruh teks. Ini membuatnya ringan, tetapi label harus dirancang dengan hati-hati.

Docker Compose

services:
  loki:
    image: grafana/loki:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:3100:3100"
    volumes:
      - ./loki-config.yml:/etc/loki/local-config.yaml:ro
      - loki-data:/loki

  promtail:
    image: grafana/promtail:latest
    restart: unless-stopped
    volumes:
      - /var/log:/var/log:ro
      - ./promtail-config.yml:/etc/promtail/config.yml:ro

volumes:
  loki-data:

Promtail

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: system
    static_configs:
      - targets: [localhost]
        labels:
          job: varlogs
          host: proxmox
          __path__: /var/log/*log

  - job_name: app
    static_configs:
      - targets: [localhost]
        labels:
          job: app
          host: app-1
          __path__: /srv/app/logs/*.log

Label yang baik

LabelContoh
jobapp, nginx, postgres
hostapp-1
levelerror, info
environmentproduction

Jangan jadikan request ID sebagai label

Label dengan nilai unik tinggi (request ID, user ID, timestamp) membuat indeks meledak. Simpan sebagai isi log, bukan label.

LogQL

{job="app"} |= "error"
{job="app", level="error"} | json
{job="nginx"} |= " 500 "
sum(rate({job="app"} |= "error" [5m]))
OperatorFungsi
`=`
!=Tidak mengandung
`~`
`json`
`line_format`

Contoh error rate log:

sum(rate({job="app"} |= "ERROR" [5m]))

Alert dari log

Grafana dapat membuat alert berdasarkan query Loki.

Contoh: lebih dari 10 error per menit selama 5 menit.

sum(rate({job="app"} |= "ERROR" [1m])) > 10

Atur for dan severity agar tidak berisik.

Retensi

  • Tentukan berapa lama log disimpan.
  • Log debug mungkin cukup 3–7 hari.
  • Log audit bisa lebih lama.
  • Gunakan lifecycle storage untuk kompresi/arsip.

Keamanan log

  • Jangan log password, token, cookie, atau data pribadi.
  • Masking data sensitif di aplikasi.
  • Batasi akses Grafana/Loki.
  • Enkripsi transport dan storage.
  • Audit siapa yang mengakses log.

Alternatif

StackCatatan
Loki + GrafanaRingan, label-based
ELK/OpenSearchPencarian teks lengkap, resource besar
ClickHouseAnalitik log skala besar
Cloud loggingTerkelola, biaya per volume

Praktik: log terpusat untuk aplikasi

  1. Pastikan aplikasi menulis log JSON ke stdout/file.
  2. Jalankan Loki dan Promtail.
  3. Kirim log app dengan label job, host, environment.
  4. Query error di Grafana.
  5. Buat alert error rate.
  6. Terapkan retensi.
  7. Uji dengan memunculkan error buatan.

Troubleshooting

GejalaCek
Log tidak munculPath, permission, label
Loki penuhRetensi, volume
Query lambatLabel terlalu banyak, rentang waktu
Alert tidak jalanRule, datasource, threshold
Log terpotongUkuran baris/limit

Ringkasan

  • Centralized logging memudahkan pencarian dan korelasi.
  • Loki mengindeks label, bukan seluruh teks.
  • Label harus stabil dan rendah kardinalitas.
  • Alert log harus actionable dan tidak berisik.

On this page