Episode ini membahas access logs Traefik: mengaktifkan dengan format Common dan JSON, filter status code dan field kustom, agregasi log terpusat dengan Loki dan ELK, serta teknik debugging mulai dari log level DEBUG, inspeksi API, hingga analisis dashboard.

Metrik memberi gambaran besar, tapi untuk menelusuri satu request yang bermasalah kalian butuh detail per-request. Episode 24 membahas access logs: catatan lengkap setiap request yang lewat Traefik — dari siapa datangnya, ke mana tujuannya, berapa lama, sampai status apa yang dikembalikan.
Bagian kedua episode ini adalah debugging: teknik memeriksa konfigurasi runtime, log level yang tepat, dan cara membaca semua sinyal yang Traefik berikan. Kombinasi access log yang baik dan teknik debugging yang sistematis adalah keterampilan yang paling sering menyelamatkan kalian di insiden produksi.
Access log diaktifkan di static config. Dua format utama tersedia:
accessLog:
filePath: "/var/log/traefik/access.log"
format: common
bufferingSize: 100format: common: satu baris teks per request, mudah dibaca manusia.format: json: objek JSON per request, mudah di-parse mesin.bufferingSize: jumlah baris yang ditampung sebelum ditulis — menaikkan throughput tapi bisa menunda log.Contoh baris format Common:
127.0.0.1 - - [10/Aug/2026:09:15:22 +0000] "GET /api/users HTTP/1.1" 200 8452 "curl/8.5.0" "-" 12msFormat JSON menghasilkan struktur yang lebih kaya:
{
"ClientAddr": "127.0.0.1:51432",
"ClientHost": "127.0.0.1",
"RequestMethod": "GET",
"RequestPath": "/api/users",
"RequestProtocol": "HTTP/1.1",
"RouterName": "api@docker",
"ServiceName": "api-svc@docker",
"StatusCode": 200,
"Duration": 12000000,
"RequestHost": "api.example.com"
}Perhatikan field RouterName dan ServiceName — inilah kunci menghubungkan log dengan konfigurasi routing.
Log bervolume besar itu mahal. Filter dan pemilihan field membantu mengendalikannya:
accessLog:
format: json
filters:
statusCodes:
- "200"
- "5xx"
retryAttempts: true
fields:
defaultMode: drop
names:
ClientAddr: keep
RequestHost: keep
RequestPath: keep
StatusCode: keep
Duration: keep
ServiceName: keepfilters.statusCodes: hanya log status tertentu — di atas hanya 200 dan semua 5xx.fields.defaultMode: drop: buang semua field kecuali yang didaftarkan di names.retryAttempts: true: tambahkan field jumlah percobaan retry.Hasilnya: log ramping berisi data yang benar-benar dipakai untuk debugging dan alerting.
Access log di file lokal tidak berguna jika kalian punya puluhan node. Praktik standar: alirkan log ke sistem terpusat.
Dengan format JSON, penyerapan ke kedua sistem menjadi sederhana: log JSON dikirim apa adanya, dan sistem parsing membaca field secara otomatis. Dari Kibana atau Grafana, kalian bisa mencari semua request dari satu klien, menelusuri error beruntun, atau memetakan latensi per service.
Ketika perilaku tidak sesuai, naikkan log level Traefik ke DEBUG:
log:
level: DEBUG
filePath: "/var/log/traefik/traefik.log"Log DEBUG menampilkan detail internal: evaluasi rule, keputusan load balancing, dan proses pembaruan konfigurasi. Output-nya sangat besar — nyalakan hanya saat debugging lalu kembalikan ke INFO.
Sebelum ganti log level, mulai dari API runtime — jawaban biasanya sudah ada di sana:
curl -s http://localhost:8080/api/http/routers | python3 -m json.tool
curl -s http://localhost:8080/api/http/services | python3 -m json.toolEndpoint /api/http/routers menampilkan semua router beserta rule dan statusnya; /api/http/services menampilkan service dan server list. Kalau router yang diharapkan tidak ada, berarti provider tidak mengirimkannya — periksa labels atau resource. Perintah curl ini adalah langkah pertama debugging Traefik.
Urutan yang biasanya berhasil:
DEBUG untuk evaluasi rule yang gagal.curl memakai header Host.Tip
Buat kebiasaan memberi nama unik pada router dan service — misalnya api@docker atau blog@file. Nama inilah yang muncul di access log, API, dan dashboard. Nama yang jelas mempercepat semua debugging di kemudian hari.
Inti yang harus dibawa pulang:
drop/keep mengendalikan volume log.RouterName dan ServiceName menghubungkan log dengan konfigurasi.DEBUG untuk detail internal; kembalikan ke INFO setelah selesai.Di episode 25 selanjutnya kita akan membahas distributed tracing — mengirim trace request lintas service dengan Jaeger, Zipkin, dan OpenTelemetry, konfigurasi sampling, agent versus collector, serta menganalisis latensi breakdown dan error tracking di UI tracer. Dengan ini, satu request bisa dilacak dari browser sampai database.