Audit Log — Jejak Aktivitas Admin untuk Compliance
Purpose
Halaman ini menjelaskan cara menggunakan Audit Log untuk memantau siapa melakukan apa di dashboard HUPH. Setiap aksi admin yang penting (login, edit FAQ, upload dokumen, takeover percakapan, perubahan role, dll.) tercatat otomatis dengan konteks lengkap: pengguna, waktu, IP, device, browser.
Gunakan audit log untuk: - Investigasi incident — siapa mengubah/menghapus apa - Compliance — persyaratan regulasi pencatatan akses data - Security review — deteksi login mencurigakan atau lintasan RBAC - Training — pahami pola aktivitas counselor untuk coaching
Prerequisites
- Role super_admin atau system_admin
- Akses ke
https://admin.huph.val.id/audit
Konsep: kategori event
| Kategori | Contoh action |
|---|---|
| Authentication | user.login, user.logout, api.auth.pass |
| Content | kb.upload, kb.delete, faq.update, faq.create |
| Conversation | conversation.takeover, conversation.return_to_bot, conversation.language.override |
| Config | cluster.create, cluster.update, cluster.delete, rule.update |
| Admin | user.create, user.role_change, user.deactivate |
| RBAC | rbac.deny.dashboard_counselor (tercatat saat ada pengguna tanpa izin mencoba akses) |
Setiap row menyimpan: - Admin user (siapa yang melakukan) - Action (apa yang dilakukan) - Resource type + ID (objek yang disentuh) - Details (JSONB dengan payload before/after) - IP address, User-Agent, Device type, OS, Browser - Timestamp
Steps
1. Buka audit log
Sidebar: ADMIN → Audit Log (atau /audit).
Halaman menampilkan tabel terbalut filter:
┌─ Audit Log ────────────────────────────────────────┐
│ Filter: [User ▾] [Action ▾] [Date range] [Search] │
│ │
│ Time User Action Resource │
│ 09:42 Siti (C-CBT) faq.update faq-abc │
│ 09:38 Budi (Admin) kb.upload doc-def │
│ 09:30 Siti (C-CBT) conversation. conv-xyz │
│ takeover │
│ ... │
└────────────────────────────────────────────────────┘
2. Filter berdasarkan use case
Filter by user → lihat semua aktivitas satu admin (misal: onboarding baru untuk coach, atau investigasi karyawan)
Filter by action → misal kb.delete untuk review penghapusan
dokumen KB
Filter by date range → misal H-7 untuk weekly review
Filter by resource → klik pada row → side panel menampilkan semua action terhadap resource tersebut (contoh: seluruh history edit satu FAQ)
3. Lihat detail satu event
Klik pada row → side panel:
┌─ Event Detail ─────────────────────────────────────┐
│ Time: 2026-04-23 09:42:15 UTC │
│ User: Siti Aminah (marketing_counselor / CBT) │
│ Action: faq.update │
│ Resource: faq-local #abc-123 │
│ │
│ Before: │
│ answer: "Untuk Informatika, hubungi CIST..." │
│ After: │
│ answer: "Untuk Informatika, hubungi CIST: +│
│ *085196105421* (WhatsApp)..." │
│ │
│ IP: 10.0.12.4 • Device: Mobile (Android) │
│ Browser: Chrome 124 • OS: Android 14 │
│ │
│ [Copy to clipboard] [Export JSON] │
└────────────────────────────────────────────────────┘
3b. Diff Before/After — Phase 4 (SHIPPED 2026-04-24)
Row yang mengubah config (FAQ, cluster, persona, escalation rule, audience rule, guidance rule, chatbot config) sekarang punya dua snapshot JSON di expanded view:
- Before (merah muda) — state resource sebelum aksi
- After (hijau muda) — state resource sesudah aksi
Field yang tidak berubah akan identik di kedua panel; field yang diubah terlihat
berbeda. Untuk create/delete, salah satu panel menampilkan placeholder:
- — (no prior state) untuk create
- — (deleted) untuk delete
Click chevron di kanan row untuk expand/collapse.
3c. Widget "Perubahan Konfigurasi Terbaru" di Dashboard
Dashboard utama (setelah login) kini menampilkan 5 aksi config terbaru di bagian bawah. Setiap entri menunjukkan aksi, actor, daftar field yang berubah, dan waktu relatif.
Gunanya: operator bisa lihat apakah ada yang aneh tanpa harus buka /audit dulu. Kalau
super_admin buka dashboard pagi-pagi dan melihat "faq.bulk_deactivate oleh Budi 3 jam lalu
— 47 row" — itu langsung jadi perhatian, tanpa harus proaktif investigasi.
Klik entry → pindah ke /audit dengan filter resource_id sudah aktif.
4. Export untuk laporan
Klik Download CSV di kanan atas. File berisi semua filter aktif. Cocok untuk: - Laporan bulanan ke compliance officer - Investigasi dengan security tim - Backup sebelum purge
Retention otomatis
Audit log menyimpan minimal 90 hari via retention_sweep cron
job. Untuk retention lebih panjang, export CSV berkala.
4b. Coverage report — cek kelengkapan instrumentasi
Developer / ops bisa jalankan skrip cepat untuk lihat status setiap action family:
Output menunjukkan: - Row count + unique actors per family (cluster, faq, intent, dll) - Status — dormant / light / active / hot - Diff surface — berapa baris yang punya before_state/after_state (Phase 4 config history)
Gunanya: kalau page diaudit tapi muncul dormant, artinya belum ada
trafik — bukan bug instrumentasi. Kalau keluar hot di kolom yang
seharusnya rare (misal cluster), mungkin worth diinvestigasi.
5. RBAC denies — sinyal security
Filter action = rbac.deny.* menampilkan setiap percobaan akses
tanpa izin. Normalnya rendah (< 10/bulan). Jika spike:
- Mungkin user dapat link internal tanpa role yang tepat
- Atau sistem RBAC sedang diperas (test masuk berulang)
- Cek IP source — jika dari satu IP berulang, mungkin bot/scanner
Example scenarios
Weekly compliance review. Senior admin filter action = kb.delete
untuk 7 hari terakhir. Review setiap penghapusan — apakah ada alasan
yang tepat? Jika ada yang tidak jelas, tanyakan pelaku via chat.
Investigasi "FAQ hilang". Marketing complaint: "FAQ scholarship
Juni kok hilang?". Admin buka audit log, filter by resource type
= faq-local dan search keyword "scholarship" di details. Temukan
action faq.delete oleh siapa, kapan, kenapa (detail before berisi
konten lama — bisa dipulihkan manual).
Onboarding new admin quality check. Baru hire marketing_admin. Setelah 2 minggu, super_admin filter by user = "Budi Baru". Review apa yang sudah dia lakukan — bagus atau butuh coaching.
Security alert. Notifikasi menyebut 20x login gagal dari satu
IP. Admin buka audit log, filter action = user.login_failed AND
IP =
Troubleshooting
Event tidak muncul meskipun yakin sudah dilakukan. Gejala:
lakukan aksi, tapi audit log tidak mencatat. Penyebab 1: aksi yang
dilakukan belum di-instrument (bukan semua action di-audit, hanya
yang sensitif). Penyebab 2: async logger gagal di background.
Perbaikan: cek huph-api logs (docker logs huph-api | grep audit)
— escalate ke developer jika error.
CSV export error "too many rows". Gejala: export > 10k rows gagal. Perbaikan: perketat filter (date range, user) lalu export per batch.
Detail JSON tidak bisa di-parse. Gejala: event detail panel tampak kosong atau "Invalid JSON". Penyebab: resource model berubah sejak event dicatat, format lama. Perbaikan: view raw JSON dari database langsung (cek dengan developer).
See also
- Getting started — onboarding dan roles
- Troubleshooting — general issues
- System health — monitor sistem secara realtime
Feature Coverage widget (super_admin only)
Halaman Dashboard untuk super_admin sekarang menampilkan card
Feature Coverage di bagian bawah. Card ini agregasi dari
audit_log, menunjukkan seberapa aktif 15 fitur utama admin dipakai
dalam 7 / 30 / 90 hari terakhir.
Cara membaca
- Titik hijau di kolom Status — fitur pernah digunakan dalam window waktu yang dipilih
- Titik merah (rose) — fitur nol aktivitas. Pertimbangan:
- Apakah fitur memang belum pernah butuh dipakai (misal: Campaigns saat belum ada campaign aktif)?
- Atau fitur tidak discoverable dan tim tidak tahu ada?
- Untuk kasus kedua, update K1 PageHelp banner di halaman tersebut atau tambah nudge ke operator
- "Other (unmapped)" — action baru yang belum dikelompokkan ke
domain. Hover untuk lihat daftar action → developer perlu update
DOMAIN_MAPdiapps/api/src/routes/adminUsageStats.ts
Range
7d— aktivitas minggu ini (good untuk weekly check-in)30d— default; aktivitas bulanan (good untuk monthly review)90d— quarter view (good untuk "fitur ini pernah dipakai minimal sekali dalam 3 bulan?")
Detail per user
Widget ini HANYA agregat per fitur. Untuk detail per user (siapa
melakukan apa kapan), gunakan halaman /audit biasa dengan filter
user + action.
Kenapa HANYA super_admin
Feature Coverage memperlihatkan pola usage lintas seluruh tim admin. Data ini sensitif (indirectly implicates fitur owner yang tidak aktif). Widget di-scope super_admin saja agar tidak jadi pressure alat antar-role.