Cara Membuat Audit Log Aktivitas Pengguna di Laravel
Apa Itu Audit Log?
Audit log adalah catatan aktivitas yang dilakukan pengguna dalam sebuah aplikasi.
Contohnya:
Admin login
↓
Membuat transaksi
↓
Mengubah data pelanggan
↓
Menghapus data
↓
LogoutInformasi yang dapat dicatat:
User.
Aktivitas.
Modul.
Data yang diubah.
IP Address.
User Agent.
Waktu aktivitas.
Audit log sangat berguna untuk aplikasi bisnis yang membutuhkan keamanan dan pelacakan aktivitas pengguna.
Membuat Tabel Audit Log
Buat migration:
php artisan make:model AuditLog -mContoh migration:
Schema::create('audit_logs', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')
->nullable()
->constrained()
->nullOnDelete();
$table->string('action');
$table->string('module')->nullable();
$table->unsignedBigInteger('record_id')->nullable();
$table->json('old_values')->nullable();
$table->json('new_values')->nullable();
$table->ipAddress('ip_address')->nullable();
$table->text('user_agent')->nullable();
$table->timestamps();
});Kemudian:
php artisan migrateMembuat Model AuditLog
class AuditLog extends Model
{
protected $fillable = [
'user_id',
'action',
'module',
'record_id',
'old_values',
'new_values',
'ip_address',
'user_agent',
];
protected $casts = [
'old_values' => 'array',
'new_values' => 'array',
];
}Mencatat Aktivitas Pengguna
Contohnya ketika user membuat transaksi:
AuditLog::create([
'user_id' => auth()->id(),
'action' => 'create',
'module' => 'transaction',
'record_id' => $transaction->id,
'new_values' => $transaction->toArray(),
'ip_address' => request()->ip(),
'user_agent' => request()->userAgent(),
]);Data tersebut akan mencatat siapa yang membuat transaksi dan kapan aktivitas dilakukan.
Mencatat Perubahan Data
Untuk update, simpan data sebelum dan sesudah perubahan.
$oldData = $customer->toArray();
$customer->update($request->validated());
AuditLog::create([
'user_id' => auth()->id(),
'action' => 'update',
'module' => 'customer',
'record_id' => $customer->id,
'old_values' => $oldData,
'new_values' => $customer->fresh()->toArray(),
'ip_address' => request()->ip(),
'user_agent' => request()->userAgent(),
]);Hasilnya dapat digunakan untuk mengetahui perubahan data.
Contoh:
Nama sebelum:
Budi
Nama sesudah:
Budi SantosoMencatat Penghapusan
Sebelum data dihapus:
$oldData = $customer->toArray();
$customer->delete();
AuditLog::create([
'user_id' => auth()->id(),
'action' => 'delete',
'module' => 'customer',
'record_id' => $customer->id,
'old_values' => $oldData,
'ip_address' => request()->ip(),
'user_agent' => request()->userAgent(),
]);Dengan begitu, administrator masih memiliki riwayat data yang pernah dihapus.
Mencatat Login
Audit log juga dapat digunakan untuk mencatat login:
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
AuditLog::create([
'user_id' => auth()->id(),
'action' => 'login',
'module' => 'authentication',
'ip_address' => $request->ip(),
'user_agent' => $request->userAgent(),
]);
return redirect('/dashboard');
}Logout juga dapat dicatat:
$userId = auth()->id();
Auth::logout();
AuditLog::create([
'user_id' => $userId,
'action' => 'logout',
'module' => 'authentication',
'ip_address' => $request->ip(),
'user_agent' => $request->userAgent(),
]);Membuat Helper Audit Log
Agar tidak menulis kode berulang, buat helper:
function audit(
string $action,
string $module,
?int $recordId = null,
?array $oldValues = null,
?array $newValues = null
) {
return AuditLog::create([
'user_id' => auth()->id(),
'action' => $action,
'module' => $module,
'record_id' => $recordId,
'old_values' => $oldValues,
'new_values' => $newValues,
'ip_address' => request()->ip(),
'user_agent' => request()->userAgent(),
]);
}Kemudian cukup:
audit(
'update',
'customer',
$customer->id,
$oldData,
$newData
);Menggunakan Observer
Untuk aplikasi besar, audit log dapat menggunakan Laravel Observer.
Buat:
php artisan make:observer CustomerObserver --model=CustomerKemudian:
class CustomerObserver
{
public function created(Customer $customer): void
{
audit(
'create',
'customer',
$customer->id,
null,
$customer->toArray()
);
}
public function updated(Customer $customer): void
{
audit(
'update',
'customer',
$customer->id,
$customer->getOriginal(),
$customer->getChanges()
);
}
public function deleted(Customer $customer): void
{
audit(
'delete',
'customer',
$customer->id,
$customer->toArray()
);
}
}Observer kemudian didaftarkan pada model atau service provider sesuai struktur aplikasi.
Hanya Catat Data yang Berubah
Tidak selalu perlu menyimpan seluruh record.
Untuk update, lebih efisien menyimpan perubahan:
$changes = $customer->getChanges();Contohnya:
{
"phone": "08123456789",
"status": "active"
}Hal ini membuat audit log lebih mudah dibaca dan mengurangi ukuran data.
Membuat Halaman Audit Log
Administrator dapat diberikan halaman:
/audit-logsContoh tampilan:
Tanggal User Aktivitas
23/08/2026 Admin Login
23/08/2026 Admin Create Customer
23/08/2026 Staff Update Transaction
23/08/2026 Manager Delete ProductTambahkan filter:
User
Aktivitas
Modul
Tanggal
IP AddressDengan filter tersebut, administrator lebih mudah mencari aktivitas tertentu.
Detail Audit Log
Ketika salah satu log dibuka:
Aktivitas : Update Customer
User : Admin
Tanggal : 23 Agustus 2026
IP : 192.168.1.20
Perubahan:
Nama
Sebelum : Budi
Sesudah : Budi Santoso
Status
Sebelum : Pending
Sesudah : ActiveHal ini sangat berguna ketika terjadi kesalahan atau perubahan data yang tidak diketahui.
Audit Log untuk Sistem Multi-Cabang
Pada aplikasi multi-cabang, audit log sebaiknya juga mencatat cabang.
Tambahkan:
$table->foreignId('branch_id')
->nullable()
->constrained();Kemudian:
AuditLog::create([
'user_id' => auth()->id(),
'branch_id' => auth()->user()->branch_id,
'action' => 'update',
'module' => 'transaction',
'record_id' => $transaction->id,
]);Administrator pusat dapat melihat:
Cabang Bekasi
Cabang Karawang
Cabang Bandungbeserta aktivitas masing-masing.
Jangan Mencatat Password
Audit log harus berhati-hati terhadap data sensitif.
Jangan menyimpan:
password
password_confirmation
token
secret key
API key
nomor kartuJika menggunakan $request->all(), sebaiknya lakukan filtering terlebih dahulu.
Contohnya:
$data = $request->except([
'password',
'password_confirmation',
'token',
]);Menjaga Audit Log
Audit log sebaiknya tidak mudah diubah oleh pengguna biasa.
Idealnya:
User
↓
Melakukan aktivitas
↓
Audit Log
↓
Admin membacaBukan:
User
↓
Aktivitas
↓
User dapat menghapus audit logUntuk sistem dengan kebutuhan keamanan tinggi, akses penghapusan audit log sebaiknya sangat dibatasi.
Audit Log vs Laravel Log
Keduanya memiliki fungsi berbeda.
Laravel Log biasanya digunakan untuk:
Error
Exception
Debug
System eventSedangkan Audit Log digunakan untuk:
Siapa melakukan apa
Kapan dilakukan
Data apa yang berubahContohnya:
Laravel Log:
Database connection failed.
Audit Log:
Admin mengubah harga produk A.Keduanya dapat digunakan secara bersamaan.
Audit Log Bersama Ovla Media
Ovla Media dapat membantu mengembangkan sistem audit dan keamanan aplikasi Laravel, termasuk:
Audit log pengguna.
Login history.
Activity monitoring.
Role dan permission.
Multi-cabang.
Tracking perubahan data.
Security logging.
Dashboard monitoring.
Laravel Pulse.
Aplikasi bisnis custom.
Audit log dapat diterapkan pada sistem klinik, Point of Sales, inventory, koperasi, CRM, ERP, maupun aplikasi internal perusahaan.
Kesimpulan
Audit log membantu perusahaan mengetahui aktivitas pengguna di dalam aplikasi.
Konsep sederhananya:
User
↓
Melakukan Aktivitas
↓
Laravel
↓
Audit Log
↓
AdminData yang dapat dicatat antara lain:
User.
Aktivitas.
Modul.
Record ID.
Data sebelum perubahan.
Data setelah perubahan.
IP Address.
User Agent.
Waktu aktivitas.
Untuk aplikasi bisnis, audit log sangat berguna ketika perlu mengetahui siapa yang mengubah, membuat, atau menghapus suatu data.
Yang paling penting, jangan menyimpan password, token, API key, atau informasi sensitif lainnya ke dalam audit log.
Artikel Terkait
Cara Membuat Login Menggunakan Email atau Username di Laravel
Laravel dapat dibuat agar pengguna login menggunakan email atau username dalam satu form. Dengan validasi yang tepat, sistem dapat mencari akun berdasarkan salah satu identitas tersebut tanpa membuat halaman login terpisah.
Cara Membuat Sistem Approval Bertingkat di Laravel
Sistem approval bertingkat pada Laravel memungkinkan sebuah pengajuan melewati beberapa tahap persetujuan sebelum dinyatakan selesai. Sistem ini cocok untuk pengajuan cuti, pembelian, reimbursement, dokumen, anggaran, hingga proses bisnis yang membutuhkan persetujuan beberapa level.
Cara Membuat Invoice PDF Laravel dengan Nomor Otomatis
Invoice PDF dapat dibuat secara otomatis menggunakan Laravel untuk menghasilkan dokumen tagihan yang rapi dan mudah dikirim kepada pelanggan. Nomor invoice juga dapat dibuat secara otomatis berdasarkan transaksi sehingga setiap invoice memiliki identitas yang unik dan mudah dilacak