Mangcoding

icon chat
samsul aripin - Jumat, 13 Juni 2025 - 6 bulan yang lalu

Logging Itu Wajib — Biar Gak Jadi Dukun Saat Error

single image

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. 😅

Link Mangcoding

Apa Itu Logging dan Kenapa Penting?

[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.

Link Copied to Clipboard