Cara Membuat Activity Log di Laravel: Lacak Siapa Mengubah Apa (Panduan Lengkap 2026)
Cara Membuat Activity Log di Laravel: Lacak Siapa Mengubah Apa (Panduan Lengkap 2026)
Activity log di Laravel adalah catatan siapa melakukan apa, pada data apa, dan kapan — misalnya "Admin mengubah harga produk X dari Rp50.000 menjadi Rp55.000 pada 29 Oktober 2026 pukul 20:00". Panduan ini menunjukkan dua cara membuatnya: cepat dengan package Spatie Activity Log, dan manual dengan observer untuk kontrol penuh, plus cara menampilkan, mengamankan, dan merawat log agar tidak membebani database.
Apa itu activity log dan kenapa aplikasi membutuhkannya?
Activity log berbeda dari file log Laravel di storage/logs/laravel.log. File log mencatat error dan jejak teknis untuk developer, sedangkan activity log mencatat aksi bisnis untuk manusia: siapa login, siapa mengubah data, siapa menghapus produk, siapa mengekspor laporan. Begitu ada komplain "kok harga berubah sendiri?" atau "siapa yang menghapus data ini?", jawabannya ada di activity log — bukan di tebakan.
Fitur ini hampir wajib pada source code aplikasi admin, kasir, dan toko: semakin banyak user yang bisa mengubah data, semakin besar kebutuhan akan jejak audit. Tanpa activity log, setiap perubahan yang salah menjadi misteri; dengan activity log, setiap perubahan bisa ditelusuri sampai ke user dan waktunya.
Apa saja yang sebaiknya dicatat — dan apa yang tidak boleh dicatat?
Jangan mencatat semua hal. Log yang terlalu berisik justru sulit dibaca dan cepat membengkak. Catat aksi yang mengubah keadaan atau penting secara keamanan: login dan logout, tambah, ubah, dan hapus data master (produk, user, harga), perubahan role dan permission, ekspor data, serta persetujuan atau penolakan (misalnya approve refund).
Sebaliknya, jangan pernah mencatat data sensitif: password, token, API key, OTP, atau isi pesan pribadi. Satu baris log yang berisi password adalah kebocoran keamanan yang tersimpan permanen di database. Prinsipnya sederhana: log mencatat bahwa sesuatu terjadi dan oleh siapa, bukan menyalin seluruh isi rahasia di baliknya.
Jalur 1: Cara cepat dengan Spatie Activity Log
Cara tercepat dan paling teruji adalah package spatie/laravel-activitylog, yang dipakai luas di ekosistem Laravel dan didokumentasikan di situs resmi Spatie. Instal dan publikasikan migration serta konfigurasinya:
Perintah di atas membuat tabel activity_log yang menyimpan nama log, deskripsi, subjek (model yang berubah), causer (user pelakunya), properti berupa nilai lama dan baru dalam format JSON, jenis event, dan waktu kejadian. Selanjutnya, tambahkan trait ke model yang ingin dilacak, misalnya Product:
Tiga pengaturan di atas adalah kunci kerapian log. logOnly() membatasi kolom yang dilacak, logOnlyDirty() hanya mencatat kolom yang benar-benar berubah, dan dontSubmitEmptyLogs() mencegah baris log kosong saat model disimpan tanpa perubahan. Sejak trait ini aktif, setiap create, update, dan delete pada produk otomatis tercatat lengkap dengan nilai lama dan barunya.
Untuk aksi yang bukan perubahan model — misalnya login, ekspor laporan, atau ubah pengaturan — catat secara manual dengan helper activity():
Jalur 2: Activity log manual dengan observer (tanpa package)
Kalau kamu tidak ingin menambah dependensi, Laravel sudah menyediakan jalannya sendiri: Eloquent observer yang didokumentasikan di laravel.com/docs/eloquent-observers. Buat tabel sendiri, misalnya activity_logs dengan kolom user_id, action, subject_type, subject_id, old_values, new_values, dan created_at, lalu buat observer yang menulis ke tabel itu setiap kali model berubah:
Daftarkan observer di model atau di AppServiceProvider, dan ulangi pola yang sama untuk event created dan deleted bila diperlukan. Jalur manual memberi kontrol penuh atas nama kolom, format deskripsi, dan aturan penyimpanan — dengan harga: kamu sendiri yang menulis dan merawat semua kodenya.
Spatie vs manual: mana yang sebaiknya dipilih?
| Aspek Spatie Activity Log Observer manual | ||
| Waktu implementasi | Cepat, sekali pasang langsung jalan | Lebih lama, tulis migration, model, dan observer sendiri |
| Nilai lama vs baru | Otomatis dari trait | Ditulis sendiri lewat getOriginal() dan getChanges() |
| Aksi non-model (login, ekspor) | Bisa, lewat helper activity() | Bisa, lewat pemanggilan model log langsung |
| Kontrol format & kolom | Mengikuti struktur package | Bebas sepenuhnya |
| Perawatan jangka panjang | Mengikuti update package | Tanggung jawab penuh di tanganmu |
Pilih Spatie bila kamu ingin fitur audit yang cepat jadi dan teruji — ini pilihan yang tepat untuk sebagian besar source code aplikasi admin dan kasir. Pilih jalur manual bila struktur log harus mengikuti skema database yang sudah ada, atau bila proyekmu memang menghindari dependensi tambahan. Keduanya sah; yang tidak disarankan adalah tidak mencatat sama sekali.
Bagaimana cara menampilkan activity log di halaman admin?
Log yang hanya tersimpan di database tapi tidak bisa dibaca admin sama saja tidak ada. Buat satu halaman khusus yang menampilkan log terbaru, lengkap dengan nama pelaku dan data yang berubah. Untuk jalur Spatie, controller-nya kurang lebih seperti ini:
Perhatikan with(['causer', 'subject']): tanpa eager loading, setiap baris log akan memicu query tambahan untuk mengambil data user pelakunya, dan halaman dengan 20 baris bisa berubah menjadi puluhan query. Masalah ini punya nama, yaitu N+1 query, dan cara mengatasinya sudah dibahas tuntas di artikel Cara Mengatasi N+1 Query di Laravel. Di sisi tampilan, sediakan filter minimal yang berguna: berdasarkan user, jenis aksi, dan rentang tanggal. Filter inilah yang membuat log bisa dipakai saat investigasi, bukan sekadar daftar panjang yang harus di-scroll.
Halaman log juga bisa menjadi panel baru di dashboard admin. Kalau kamu sedang membangun dashboard penjualan, pola query dan tampilannya mirip dengan yang dipakai di artikel Cara Membuat Dashboard Statistik Penjualan di Laravel dengan Chart.js — bedanya, di sini datanya adalah riwayat aksi, bukan angka penjualan.
Bagaimana cara mengamankan halaman activity log?
Activity log adalah dokumen sensitif: ia menunjukkan siapa melakukan apa di dalam sistem. Karena itu, halamannya wajib dibatasi hanya untuk admin atau super admin, bukan untuk semua user yang sedang login. Gunakan sistem role dan permission yang sudah ada di aplikasimu — kalau belum punya, mulailah dari panduan Cara Membuat Multi Role & Permission di Laravel — lalu kunci route halaman log hanya untuk role yang berwenang.
Selain membatasi siapa yang bisa melihat, batasi juga apa yang bisa dilakukan terhadap log: user biasa tidak boleh mengubah atau menghapus baris log, karena log yang bisa dihapus oleh pelakunya sendiri kehilangan fungsi auditnya. Untuk aplikasi yang ketat, hapus log hanya lewat proses retensi otomatis yang dibahas di bawah, bukan lewat tombol hapus di halaman admin.
Bagaimana cara merawat activity log agar database tidak membengkak?
Tabel log adalah tabel yang hanya bertambah. Aplikasi kasir atau toko yang aktif bisa menghasilkan ribuan baris log per bulan, dan tanpa perawatan, tabel ini akan melambat dan membebani backup. Tetapkan masa retensi sejak awal — misalnya 90 hari untuk log operasional biasa, lebih lama untuk log keuangan — lalu jadwalkan penghapusan otomatis setiap hari:
Untuk jalur manual, ganti Activity dengan model log buatanmu sendiri; polanya sama. Tambahkan juga index pada kolom yang sering dipakai untuk filter, seperti created_at dan log_name, agar query halaman log tetap cepat meski tabel sudah besar. Terakhir, jangan jadikan activity log sebagai pengganti backup database: log menjawab "siapa mengubah apa", sedangkan backup menjawab "bagaimana cara mengembalikan data" — keduanya dibutuhkan, untuk keperluan yang berbeda.
Keterbatasan cara ini
Activity log bukan solusi untuk semua masalah. Pertama, ia mencatat aksi di level aplikasi, bukan di level database — perubahan langsung lewat query SQL manual atau phpMyAdmin tidak akan tercatat. Kedua, log menambah satu operasi tulis database di setiap aksi yang dilacak, jadi jangan melacak model yang berubah ribuan kali per menit tanpa mempertimbangkan dampak performanya. Ketiga, log hanya berguna bila dibaca: jadwalkan peninjauan berkala, misalnya setiap minggu admin memeriksa aksi penghapusan dan perubahan role, agar anomali ketahuan sebelum menjadi masalah besar.
FAQ
Apa bedanya activity log dengan file log Laravel?
File log di storage/logs/laravel.log mencatat error dan jejak teknis untuk developer. Activity log mencatat aksi bisnis — siapa, melakukan apa, pada data apa, dan kapan — untuk admin dan keperluan audit.
Apakah Spatie Activity Log gratis?
Ya, package ini open source dan gratis dipakai, termasuk untuk proyek komersial seperti source code yang dijual. Dukungan dan pengembangannya didanai lewat produk berbayar Spatie yang lain.
Apakah activity log memperlambat aplikasi?
Dampaknya kecil untuk aksi biasa karena hanya menambah satu operasi tulis per aksi yang dilacak. Dampak baru terasa bila kamu melacak model yang berubah sangat sering; dalam kasus itu, batasi kolom yang dilacak dengan logOnly() dan terapkan retensi.
Bisakah activity log mencatat siapa yang login?
Ya. Login bukan perubahan model, jadi catat secara manual: pada event login, panggil helper activity() dengan causer user yang login dan deskripsi seperti "login ke sistem".
Apakah log lama boleh dihapus?
Boleh, selama sesuai kebijakan retensi yang kamu tetapkan. Hapus otomatis berdasarkan umur log, misalnya 90 hari, dan simpan lebih lama untuk log yang berkaitan dengan keuangan atau keamanan.
Apakah activity log menggantikan backup database?
Tidak. Activity log menjelaskan riwayat perubahan, sedangkan backup mengembalikan data ke kondisi sebelumnya. Keduanya saling melengkapi dan sebaiknya sama-sama ada.
Kapan sebaiknya memilih jalur manual daripada Spatie?
Pilih jalur manual bila struktur tabel log harus mengikuti skema yang sudah ada, atau bila proyekmu menghindari dependensi tambahan dan timmu siap merawat kode log itu sendiri.
Artikel Terkait
WordPress 7.1.4 Rilis 28 Oktober 2026: 22 Perbaikan Keamanan, Update Sekarang Jangan Tunggu 7.2
02 Nov 2026
PHP2Shell Masuk Katalog KEV CISA 26 Oktober 2026: Eksploitasi Terkonfirmasi, Tenggat Patch Hari Ini
30 Oct 2026
Cara Menulis README & Dokumentasi Source Code yang Membuat Pembeli Percaya (Panduan 2026)
30 Oct 2026
Laravel 13.39.0 Rilis 27 Oktober 2026: Model Tanpa Primary Key, restoreOrCreate & Dampaknya untuk Source Code Kamu
28 Oct 2026