Log yang baik adalah log yang bisa dibaca mesin. Episode ini membahas prinsip structured logging, apa yang boleh dan tidak boleh dilog, library logging terbaik per bahasa, serta korelasi log dengan TraceID untuk melengkapi pillar observability.

Loki bisa menyimpan log tak terstruktur, tapi kalian akan kesulitan menggali makna darinya. Structured logging — menulis log sebagai pasangan key-value atau JSON — adalah praktik yang mengubah log dari teks mentah menjadi data yang bisa diquery, diagregasi, dan dikorelasikan.
Episode ini membahas prinsip structured logging, apa yang harus dan tidak boleh dicatat, perbandingan library logging per bahasa, serta teknik korelasi log dengan TraceID. Kualitas log di episode 10 akan sangat ditentukan oleh praktik yang kalian pelajari sekarang.
Log terstruktur selalu berbentuk field bernama. Setiap peristiwa menjadi satu objek JSON dengan timestamp, level, dan konteks:
{
"ts": "2026-08-10T11:20:05Z",
"level": "error",
"service": "checkout",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"order_id": "ord-1042",
"error": "payment gateway timeout",
"retry_count": 3
}Perhatikan konsistensi nama field: ts, level, service, trace_id dipakai di semua service agar query lintas service konsisten.
Level yang berlebihan di production memperbesar volume log dan biaya storage tanpa nilai tambah.
Beberapa kategori peristiwa yang layak dicatat:
import structlog
logger = structlog.get_logger()
def create_order(order_id):
logger.info("order.created", order_id=order_id, total=150000)Panggilan logger.info("order.created", ...) menghasilkan log JSON dengan field yang langsung bisa diquery di Loki.
Jangan pernah mencatat:
{
"ts": "2026-08-10T11:20:05Z",
"level": "info",
"event": "login.success",
"password_hash": "jangan-pernah",
"card_number": "4111-1111-1111-1111"
}Field seperti password_hash di atas tidak boleh pernah muncul di log. Dampak kebocoran data ini akan dibahas lebih lanjut di episode 33.
zap dan zerolog — keduanya cepat dan mendukung output JSON.logback dan log4j2 dengan pattern encoder JSON.structlog dan python-json-logger.winston dan pino — pino terkenal sangat ringan.pip install structlogSetelah pip install structlog, kalian bisa langsung memakai contoh create_order di atas.
Nilai terbesar structured logging muncul saat log dikorelasikan dengan trace. Setiap service harus menyuntikkan TraceID ke dalam setiap baris log:
gateway -> orders -> payment -> loki
trace_id="4bf92f..." menyatu di semua serviceDengan trace_id konsisten di semua log, kalian bisa menelusuri seluruh perjalanan sebuah request hanya dengan satu query di episode 18.
Tip
Aturan emas: setiap baris log harus bisa dijawab pertanyaan "request mana yang memicunya?". Jika tidak, tambahkan trace_id atau request_id — jika sudah ada, jangan pernah menghapusnya.
Di episode 12 ini kalian memahami prinsip structured logging dengan JSON dan nama field konsisten, apa yang layak dan tidak layak dilog, library terbaik per bahasa pemrograman, serta pentingnya korelasi log dengan TraceID dan Request ID.
Inti yang harus dibawa pulang:
Di episode 13 selanjutnya kita akan membahas distributed tracing dengan Tempo — backend trace berbasis object storage, arsitektur komponennya, konsep span dan sampling, serta perbandingan dengan Jaeger. Kini pillar ketiga observability mulai masuk panggung.