Logging Itu Wajib — Biar Gak Jadi Dukun Saat Error
Bayangkan ini :
Sebuah fitur baru sudah live. Lalu user lapor: “Kok nggak bisa checkout ya?” Kamu coba di lokal: jalan. Cek error di browser user : kosong.
Tanpa log, kamu cuma bisa nebak-nebak — kayak dukun meramal error dari langit. 😅
[2025-06-04 10:15:22] production.INFO: [log_id: 6a9c3e21-778e-49d4-9c98-cbba5ea0c841] User login berhasil. user_id=101 ip=103.12.5.77 url=/api/login
[2025-06-04 10:20:07] production.WARNING: [log_id: d57ab8fc-45c1-4e82-9c7d-07b8e446acf6] Permintaan aneh terdeteksi. user_id=101 ip=103.12.5.77 url=/api/products?sort=DROP+TABLE
[2025-06-04 10:21:43] production.ERROR: [log_id: a34a89df-25b9-4a57-b210-dab32e68f4c9] Checkout gagal. user_id=101 ip=103.12.5.77 url=/api/checkout error=Payment gateway timeout
[2025-06-04 10:22:00] production.INFO: [log_id: 55f3bc3d-7ed3-4cdd-b2e3-90cdb1d2c024] Notifikasi email berhasil dikirim. user_id=101 [email protected]
Logging adalah catatan otomatis tentang apa yang terjadi di dalam aplikasi. kalau kamu punya log yang rapi dan lengkap, kamu bisa :
- Cek ID transaksi
- Lihat siapa user-nya
- Lihat pesan error, trace, IP
- Dan langsung tahu titik gagalnya
Logging bukan tambahan. Logging itu penyelamat kamu dari debugging buta. Tanpa log, kamu bakal muter-muter nyari error, bingung mulai dari mana. Dengan log, kamu bisa tahu masalahnya cepat, tanpa panik, tanpa tebak-tebakan.
1. Log Setiap Exception dengan ID Unik
Saat ada exception, log-nya harus ditulis dengan ID unik (UUID). Kenapa?
Dengan ID unik di setiap error, tim frontend bisa langsung kasih tahu ID-nya ke tim backend. Tim backend tinggal cari log berdasarkan ID itu — tanpa perlu lihat stack trace di browser.
use Illuminate\Support\Str;
try {
// proses penting
} catch (Exception $e) {
$logId = Str::uuid();
Log::error("[$logId] Gagal memproses checkout", [
'user_id' => auth()->id(),
'ip' => request()->ip(),
'url' => request()->fullUrl(),
'message' => $e->getMessage(),
]);
return response()->json([
'message' => 'Terjadi kesalahan, silakan hubungi admin.',
'log_id' => $logId,
], 500);
}
Kenapa harus ke file log? Karena :
- Di production, kamu tidak boleh menampilkan stack trace ke user (security risk).
- Log file adalah satu-satunya sumber kebenaran untuk developer.
2. Sertakan Konteks Request
Jangan cuma log pesan error. Tambahkan juga :
- user_id → siapa yang pakai?
- ip → dari mana asalnya?
- url → endpoint mana yang kena?
- params → request body-nya apa?
Semakin lengkap konteks, semakin cepat kamu bisa root cause analysis.
3. Gunakan Structured Logging (Bukan Concatenation)
Jangan begini :
// ❌ string biasa
console.log("User gagal login: " + userId + ", error: " + err.message);
Lakukan seperti ini :
// ✅ structured
console.error("Login gagal", {
userId: user.id,
error: err.message,
ip: req.ip,
path: req.originalUrl
});
Structured log memudahkan :
- Pencarian
- Indexing oleh tool seperti ELK, Datadog
- Dibaca oleh manusia dan mesin
Format Log Umum
Entah log kamu dalam format file biasa (.log) atau JSON, berikut info yang sebaiknya selalu ada :
- timestamp → waktu kejadian
- level → ERROR, INFO, WARN, dll
- message → apa yang terjadi
- log_id → ID unik
- user_id, ip, url → konteks
- ❗ Jangan log password, token, kartu kredit, dll.
4. Pecah file log secara rutin, biar nggak numpuk dan bikin disk penuh.
Log bisa tumbuh cepat.
Kalau dibiarkan :
- Disk bisa penuh
- Aplikasi bisa crash
Solusi :
- Laravel: set logging.php ke daily
- Linux: gunakan logrotate
- Tambahkan monitoring disk usage
Catatan: Artikel ini terinspirasi dari postingan Mayank A. di LinkedIn yang membahas tentang best practices dalam software development. Kamu bisa baca versi aslinya di sini.