Second Brain

Sebuah catatan perjalanan menekuni bidang IT Infra, Cloud, DevOps, dan Security

Implementasi Centralized Logging dengan PLG Stack (Promtail, Loki, Grafana) pada Lingkungan Hybrid

Ketika ada laporan error pada aplikasi, kita harus masuk ke server satu per satu, membuka terminal, dan menjalankan tail -f. Cara ini tidak scalable dan menghambat proses Root Cause Analysis (RCA).

Dalam artikel ini, saya mendokumentasikan implementasi Centralized Logging menggunakan PLG Stack (Promtail, Loki, Grafana). Solusi ini memungkinkan pengumpulan log dari sistem operasi (Linux) dan container (Docker) ke dalam satu dashboard terpadu.

Arsitektur Sistem

  • Loki (Server): “Gudang” penyimpanan log yang ringan (diinstall di VPS Monitoring).

  • Promtail (Agent): “Kurir” yang membaca & mengirim log (diinstall di VPS Target Aplikasi).

  • Grafana (UI): Antarmuka visual untuk query dan analisis log.

Instalasi Loki

Loki saya install menggunakan systemd untuk performa yang lebih stabil dan manajemen resource yang terukur di level OS.

Download & Install Binary:

# Download versi stabil
cd /tmp
wget https://github.com/grafana/loki/releases/download/v2.9.2/loki-linux-amd64.zip
unzip loki-linux-amd64.zip

# Pindahkan ke path eksekusi
sudo mv loki-linux-amd64 /usr/local/bin/loki
sudo chmod a+x /usr/local/bin/loki

Konfigurasi Loki:

Membuat file /etc/loki/config.yml dengan konfigurasi penyimpanan lokal (filesystem) yang efisien.

auth_enabled: false
server:
  http_listen_port: 3100
common:
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory
schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

Membuat Service Systemd:

Agar Loki berjalan otomatis saat booting dan mudah di-manage (start, stop, restart).

Buat konfigurasi untuk service systemd loki, buat file /etc/systemd/system/loki.service

[Unit]
Description=Loki Log Aggregator
After=network.target

[Service]
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/config.yml
Restart=always

[Install]
WantedBy=multi-user.target

Enable service Loki dengan command berikut:

sudo systemctl enable --now loki

 

Instalasi Promtail (Di VPS Target Aplikasi)

Promtail dikonfigurasi untuk membaca dua jenis log sekaligus: Log Sistem Linux (/var/log) dan Log Container Docker.

Download & Install:

cd /tmp
wget https://github.com/grafana/loki/releases/download/v2.9.2/promtail-linux-amd64.zip
unzip promtail-linux-amd64.zip

Konfigurasi Promtail:

Membuat file /etc/promtail/config.yml. Bagian terpenting adalah scrape_configs yang mendefinisikan sumber log.

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

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

scrape_configs:
# Job 1: Log Sistem Operasi (Syslog/Auth)
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: system
      host: vps-app-01
      __path__: /var/log/*.log

# Job 2: Log Docker Container (WordPress/MySQL)
- job_name: docker
  static_configs:
  - targets:
      - localhost
    labels:
      job: docker
      host: vps-app-01
      __path__: /var/lib/docker/containers/*/*-json.log

Enable service promtail dengan command berikut:

sudo systemctl enable --now promtail

 

Integrasi & Visualisasi di Grafana

Setelah data mengalir, langkah terakhir adalah visualisasi.

  1. Add Data Source: Pilih Loki dan masukkan URL http://localhost:3100 (jika Grafana satu server dengan Loki).

  2. Validasi Data (LogQL): Menggunakan fitur Explore di Grafana untuk memvalidasi log yang masuk.

    • Melihat semua log Docker: {job="docker"}

    • Filter Error Spesifik: {job="docker"} |= "error"

  3. Membuat Dashboard: Saya membuat dashboard sederhana yang bisa digunakan untuk memonitoring Host dengan OS linux dan aplikasi yang dijalankan dengan Docker: