Episode ini membahas observabilitas: directive log dengan format Common, JSON, dan custom, output ke file atau stdout, structured logging dengan placeholder, agregasi log dengan ELK dan Loki, serta Prometheus metrics dan debugging.

Ketika sesuatu rusak di produksi, log adalah saksi pertama. Episode 22 membahas observabilitas di Caddy: mencatat akses dan error dengan benar, memformat log agar mudah diurai mesin, mengirim log ke sistem terpusat, memantau metrics dengan Prometheus, dan debugging dengan level log yang tepat.
Kalian akan belajar directive log, format Common Log dan JSON, custom log fields dengan placeholder, agregasi ke ELK atau Loki, dan cara memanfaatkan admin API untuk metrics serta troubleshooting.
Sebuah sistem tanpa log yang baik adalah kotak hitam. Mari kita buka kotak itu.
Secara default Caddy menulis log error ke stderr. Untuk mencatat akses, aktifkan directive log:
example.com {
log {
output stdout
format json
}
root * /var/www
file_server
}output stdout mengirim log akses ke output standar — berguna di container. format json membuat log terstruktur yang mudah diurai.
Untuk penyimpanan jangka panjang:
example.com {
log {
output file /var/log/caddy/access.log {
roll_size 100mb
roll_keep 10
}
}
root * /var/www
file_server
}roll_size 100mb dan roll_keep 10 mengatur rotasi: file dibagi tiap 100 MB dan 10 file terakhir dipertahankan.### Log Level
Filter berdasarkan level kepentingan:
example.com {
log {
level INFO
output stdout
}
root * /var/www
file_server
}Level tersedia: DEBUG, INFO, WARN, ERROR, PANIC, dan FATAL. DEBUG mencatat detail lengkap; ERROR hanya mencatat kesalahan. Untuk produksi, INFO biasanya cukup.## Structured Logging
Format JSON memudahkan mesin membaca log. Tambahkan field kustom dengan placeholder:
example.com {
log {
format json {
time_format rfc3339
}
output stdout
}
root * /var/www
file_server
}Placeholder yang berguna di log:
{method} dan {uri} — request yang masuk.{status} — kode status respons.{duration} — waktu proses.{remote_host} — IP klien.{header.User-Agent} — user agent.log { format json ... } dengan time_format rfc3339 memberi timestamp standar untuk tooling.
Log akses lengkap berisi waktu, IP klien, metode, path, status, ukuran respons, user agent, durasi, dan versi protokol. Untuk reverse proxy, ditambah informasi backend seperti {upstream.address}. Semua bisa disertakan lewat placeholder kustom.
Satu server berarti satu tempat log. Banyak server? Butuh agregasi:
Karena format JSON sudah terstruktur, tooling agregasi bisa langsung memproses. Kirim log Caddy ke log shipper seperti Filebeat atau Promtail, lalu menuju sistem pusat.
Caddy mengekspos metrics Prometheus melalui admin API:
curl http://localhost:2019/metricsOutput berupa format text Prometheus: counter request, histogram durasi, dan lainnya. curl http://localhost:2019/metrics di-scrape oleh Prometheus secara berkala untuk dashboard dan alerting.
Untuk uptime monitoring, pastikan ada health endpoint:
example.com {
respond /healthz 200 "OK"
root * /var/www
file_server
}Kombinasi health endpoint, metrics Prometheus, dan log teragregasi memberi pandangan penuh: apakah situs hidup, seberapa cepat, dan apa yang salah.
Saat ada masalah, tingkatkan detail:
caddy run --config Caddyfile --debugcaddy run --debug menampilkan log DEBUG — termasuk decision routing dan detail TLS. Alur debugging yang disarankan:
caddy validate.--debug.curl dan openssl.caddy validate --config Caddyfile memeriksa sintaks sebelum produksi — langkah wajib di deployment (episode 30).
Untuk masalah yang sulit, aktifkan DEBUG dan telusuri log per request. Dengan format JSON, filter berdasarkan request.id akan memperlihatkan perjalanan satu request dari awal sampai akhir.
Episode 22 membangun observabilitas: directive log dengan output ke stdout atau file dan rotasi, format Common dan JSON dengan placeholder, agregasi log ke ELK atau Loki, metrics Prometheus via admin API, serta teknik debugging dengan --debug dan validasi.
Inti yang harus dibawa pulang:
log { output stdout format json } mencatat akses terstruktur./metrics admin API.caddy run --debug menampilkan detail lengkap request.caddy validate memeriksa konfigurasi sebelum deploy.Di episode 23 selanjutnya kita akan membahas admin API & dynamic configuration — endpoint admin API, memuat dan mengganti konfigurasi JSON, hot reload tanpa downtime, perbedaan JSON vs Caddyfile, serta otomasi CI/CD dengan API. Konfigurasi dinamis akan membuka kemungkinan baru.