26 Mar 2025·7 menit membaca

Pencatatan audit untuk alat internal: pola sejarah perubahan yang rapi

Pencatatan audit praktis untuk alat internal: lacak siapa melakukan apa dan kapan pada setiap perubahan CRUD, simpan diff dengan aman, dan tampilkan feed aktivitas admin.

Pencatatan audit untuk alat internal: pola sejarah perubahan yang rapi

Mengapa alat internal perlu audit log (dan di mana biasanya gagal)

Kebanyakan tim menambahkan audit log setelah sesuatu salah. Seorang pelanggan mempersoalkan perubahan, angka keuangan bergeser, atau auditor bertanya, "Siapa yang menyetujui ini?" Jika Anda baru mulai saat itu, Anda akan berusaha merekonstruksi masa lalu dari petunjuk parsial: cap waktu database, pesan Slack, dan tebakan.

Untuk sebagian besar aplikasi internal, "cukup untuk kepatuhan" tidak berarti sistem forensik sempurna. Itu berarti Anda bisa menjawab sekumpulan pertanyaan kecil dengan cepat dan konsisten: siapa yang membuat perubahan, record mana yang terkena, apa yang berubah, kapan itu terjadi, dan dari mana asalnya (UI, impor, API, automatisasi). Kejelasan itu yang membuat audit log sesuatu yang benar-benar dipercaya.

Kegagalan audit log biasanya bukan di database. Itu pada cakupan. Riwayat terlihat baik untuk edit sederhana, lalu celah muncul begitu pekerjaan dilakukan dengan cepat. Pelaku umum adalah edit massal, impor, job terjadwal, aksi admin yang melewati layar normal (seperti reset kata sandi atau mengubah peran), dan penghapusan (terutama hard delete).

Kegagalan lain yang sering terjadi adalah mencampur log debugging dengan audit log. Debug log dibuat untuk pengembang: berisik, teknis, dan seringkali tidak konsisten. Audit log dibuat untuk akuntabilitas: field yang konsisten, kata-kata yang jelas, dan format stabil yang bisa Anda tunjukkan kepada non-engineer.

Contoh praktis: seorang manajer dukungan mengubah paket pelanggan, lalu sebuah automatisasi memperbarui detail penagihan kemudian. Jika Anda hanya mencatat "mengubah customer," Anda tidak bisa tahu apakah seorang manusia yang melakukannya, workflow yang melakukannya, atau impor yang menimpanya.

Field audit log yang menjawab siapa, apa, kapan

Audit logging yang baik dimulai dengan satu tujuan: seorang manusia harus bisa membaca satu entri dan memahami apa yang terjadi tanpa menebak.

Siapa yang melakukannya

Simpan aktor yang jelas untuk setiap perubahan. Kebanyakan tim berhenti pada "user id," tetapi alat internal sering mengubah data lewat lebih dari satu pintu.

Sertakan tipe aktor dan identifier aktor, sehingga Anda bisa membedakan antara staf, akun layanan, atau integrasi eksternal. Jika Anda punya tim atau tenant, juga simpan organization atau workspace id supaya event tidak tercampur.

Apa yang terjadi dan pada record mana

Tangkap aksi (create, update, delete, restore) ditambah target. "Target" sebaiknya ramah manusia dan presisi: nama tabel atau entitas, id record, dan idealnya label singkat (mis. nomor pesanan) untuk pemindaian cepat.

Set lapangan minimum yang praktis:

  • actor_type, actor_id (dan actor_display_name jika ada)
  • action dan target_type, target_id
  • happened_at_utc (timestamp disimpan dalam UTC)
  • source (screen, endpoint, job, import) dan ip_address (hanya jika diperlukan)
  • reason (opsional, komentar untuk perubahan sensitif)

Kapan itu terjadi

Simpan timestamp dalam UTC. Selalu. Lalu tampilkan dalam waktu lokal pemirsa di UI admin. Ini menghindari argumen "dua orang melihat waktu berbeda" selama review.

Jika Anda menangani aksi berisiko tinggi seperti perubahan peran, pengembalian dana, atau ekspor data, tambahkan field "reason." Bahkan catatan singkat seperti "Disetujui oleh manajer di tiket 1842" dapat mengubah jejak audit dari kebisingan menjadi bukti.

Pilih model data: event log vs riwayat terversi

Pilihan desain pertama adalah di mana "kebenaran" riwayat perubahan berada. Kebanyakan tim berakhir dengan salah satu dari dua model: event log append-only, atau tabel riwayat versi per-entity.

Opsi 1: Event log (tabel aksi append-only)

Event log adalah satu tabel yang merekam setiap aksi sebagai baris baru. Setiap baris menyimpan siapa yang melakukannya, kapan itu terjadi, entitas apa yang disentuh, dan payload (sering JSON) yang menjelaskan perubahan.

Model ini mudah ditambahkan dan fleksibel ketika model data Anda berkembang. Ia juga memetakan secara alami ke feed aktivitas admin karena feed dasarnya adalah "event terbaru lebih dulu."

Opsi 2: Riwayat terversi (versi per-entity)

Pendekatan riwayat terversi membuat tabel riwayat per entitas, seperti Order_history atau User_versions, di mana setiap update membuat snapshot penuh baru (atau sekumpulan field yang terstruktur) dengan nomor versi.

Ini membuat pelaporan point-in-time lebih mudah ("seperti apa record ini Selasa lalu?"). Ini juga bisa terasa lebih jelas untuk auditor, karena garis waktu setiap record bersifat self-contained.

Cara praktis memilih:

  • Pilih event log jika Anda ingin satu tempat untuk mencari, feed aktivitas yang mudah, dan friction rendah ketika entitas baru muncul.
  • Pilih versioned history jika Anda membutuhkan timeline tingkat record sering, tampilan point-in-time, atau diff per-entity yang mudah.
  • Jika penyimpanan menjadi perhatian, event log dengan diff per-field biasanya lebih ringan daripada snapshot penuh.
  • Jika pelaporan adalah tujuan utama, tabel versi bisa lebih sederhana di-query daripada mem-parsing payload event.

Apapun yang Anda pilih, buat entri audit immutable: tidak ada update, tidak ada delete. Jika ada yang salah, tambahkan entri baru yang menjelaskan koreksi.

Pertimbangkan juga menambahkan correlation_id (atau operation id). Satu aksi pengguna sering memicu banyak perubahan (misalnya, "Deactivate user" memperbarui user, mencabut session, dan membatalkan tugas tertunda). correlation id bersama memungkinkan Anda mengelompokkan baris tersebut menjadi satu operasi yang dapat dibaca.

Tangkap aksi CRUD dengan andal (termasuk delete dan edit massal)

Audit logging yang andal dimulai dengan satu aturan: setiap penulisan melewati satu jalur yang juga menulis event audit. Jika beberapa update terjadi dalam background job, impor, atau layar edit cepat yang melewati flow save normal, log Anda akan berlubang.

Untuk create, catat aktor dan sumber (UI, API, import). Impor adalah tempat tim sering kehilangan "siapa," jadi simpan nilai "performed by" eksplisit meskipun data datang dari file atau integrasi. Juga berguna menyimpan nilai awal (snapshot penuh atau sekumpulan field kunci) sehingga Anda bisa menjelaskan mengapa sebuah record ada.

Update lebih rumit. Anda bisa mencatat hanya field yang berubah (kecil, mudah dibaca, dan cepat), atau menyimpan snapshot penuh setelah setiap save (sederhana untuk di-query nanti, tetapi berat). Jalan tengah praktis adalah menyimpan diff untuk edit normal dan menyimpan snapshot hanya untuk objek sensitif (seperti permissions, detail bank, atau aturan harga).

Delete tidak boleh menghapus bukti. Utamakan soft delete (flag is_deleted plus entri audit). Jika Anda harus hard delete, tulis event audit terlebih dahulu dan sertakan snapshot record sehingga Anda bisa membuktikan apa yang dihapus.

Perlakukan undelete sebagai aksi tersendiri. "Restore" bukan sama dengan "Update," dan memisahkannya memudahkan review dan pemeriksaan kepatuhan.

Untuk edit massal, hindari satu entri samar seperti "mengubah 500 record." Anda membutuhkan detail cukup untuk menjawab "record mana yang berubah?" nanti. Pola praktis adalah event induk plus child event per record:

  • Event induk: aktor, tool/screen, filter yang digunakan, dan ukuran batch
  • Event child per record: record id, before/after (atau field yang berubah), dan outcome (sukses/gagal)
  • Opsional: field reason bersama (pembaruan kebijakan, pembersihan, migrasi)

Contoh: seorang lead dukungan menutup massal 120 tiket. Entri induk menangkap filter "status=open, older than 30 days," dan setiap tiket mendapat entri child yang menunjukkan status open -> closed.

Simpan apa yang berubah tanpa menciptakan masalah privasi atau beban penyimpanan

Bangun alat internal siap audit
Buat alat internal dengan pencatatan audit yang terintegrasi di setiap alur kerja.
Mulai Membangun

Audit log cepat menjadi sampah ketika mereka menyimpan terlalu banyak (setiap record penuh, selamanya) atau terlalu sedikit (hanya "mengedit user"). Tujuannya adalah catatan yang dapat dipertahankan untuk kepatuhan dan mudah dibaca oleh admin.

Default praktis adalah menyimpan diff per-field untuk sebagian besar update. Simpan hanya field yang berubah, dengan nilai "before" dan "after." Ini menjaga penyimpanan tetap rendah dan membuat feed aktivitas mudah dipindai: "Status: Pending -> Approved" lebih jelas daripada blob besar.

Simpan snapshot penuh untuk momen yang penting: create, delete, dan transisi alur kerja besar. Snapshot lebih berat, tetapi melindungi Anda ketika seseorang bertanya, "Seperti apa profil pelanggan sebelum dihapus?"

Data sensitif perlu aturan masking, atau tabel audit Anda menjadi basis data kedua penuh rahasia. Aturan umum:

  • Jangan pernah menyimpan password, token API, atau private key (catat hanya "diubah")
  • Mask data personal seperti email/telepon (simpan sebagian atau nilai hash)
  • Untuk catatan atau field teks bebas, simpan pratinjau singkat dan flag "changed"
  • Catat referensi (user_id, order_id) alih-alih menyalin objek terkait secara penuh

Perubahan skema juga bisa merusak riwayat audit. Jika field nanti diganti nama atau dihapus, simpan fallback aman seperti "unknown field" plus kunci field asli. Untuk field yang dihapus, simpan nilai terakhir yang diketahui tetapi tandai sebagai "field dihapus dari skema" sehingga feed tetap jujur.

Terakhir, buat entri ramah manusia. Simpan label display ("Assigned to") berdampingan dengan kunci mentah ("assignee_id"), dan format nilai (tanggal, mata uang, nama status).

Pola langkah-demi-langkah: implementasikan audit logging dalam alur aplikasi Anda

Jejak audit yang andal bukan soal mencatat lebih banyak. Ini soal menggunakan satu pola yang dapat diulang di mana-mana sehingga Anda tidak berakhir dengan celah seperti "impor massal tidak tercatat" atau "edit mobile terlihat anonim."

1) Modelkan data audit sekali

Mulai di model data Anda dan buat satu set tabel kecil yang bisa menggambarkan perubahan apa pun.

Jaga sederhana: satu tabel untuk event, satu untuk field yang berubah, dan konteks aktor kecil.

  • audit_event: id, entity_type, entity_id, action (create/update/delete/restore), created_at, request_id
  • audit_event_item: id, audit_event_id, field_name, old_value, new_value
  • actor_context (atau field pada audit_event): actor_type (user/system), actor_id, actor_email, ip, user_agent

2) Tambahkan satu sub-proses bersama "Tulis + Audit"

Buat sub-proses yang dapat digunakan ulang yang:

  1. Menerima nama entitas, id entitas, aksi, dan nilai before/after.
  2. Menulis perubahan bisnis ke tabel utama.
  3. Membuat record audit_event.
  4. Menghitung field yang berubah dan memasukkan baris audit_event_item.

Aturannya ketat: setiap jalur penulisan harus memanggil sub-proses yang sama ini. Itu termasuk tombol UI, endpoint API, automatisasi terjadwal, dan integrasi.

3) Hasilkan aktor dan waktu di server

Jangan percaya browser untuk "siapa" dan "kapan." Baca aktor dari sesi otentikasi Anda, dan buat timestamp di sisi server. Jika automatisasi berjalan, set actor_type ke system dan simpan nama job sebagai label aktor.

4) Uji dengan satu skenario konkret

Pilih satu record konkret (mis. tiket pelanggan): buat, edit dua field (status dan assignee), hapus, lalu restore. Feed audit Anda harus menunjukkan lima event, dengan dua item update di bawah event edit, dan aktor serta timestamp terisi sama setiap kali.

Bangun feed aktivitas admin yang benar-benar bisa digunakan

Kirim feed aktivitas yang berguna
Ubah peristiwa audit menjadi feed aktivitas admin yang dapat dibaca oleh tim Anda.
Buat Feed

Audit log hanya berguna jika seseorang bisa membacanya dengan cepat selama review atau insiden. Tujuan feed admin sederhana: jawab "apa yang terjadi?" sekilas, lalu izinkan melihat lebih dalam tanpa membuat orang tenggelam dalam JSON mentah.

Mulai dengan tata letak timeline: terbaru dulu, satu baris per event, dan kata kerja yang jelas seperti Created, Updated, Deleted, Restored. Setiap baris harus menampilkan aktor (orang atau sistem), target (tipe record plus nama yang ramah manusia), dan waktu.

Format baris praktis:

  • Verb + object: "Updated Customer: Acme Co."
  • Actor: "Maya (Support)" atau "System: Nightly Sync"
  • Time: timestamp absolut (dengan timezone)
  • Ringkasan perubahan: "status: Pending -> Approved, limit: 5,000 -> 7,500"
  • Tags: Updated, Deleted, Integration, Job

Pertahankan "apa yang berubah" ringkas. Tampilkan 1-3 field secara inline, lalu tawarkan panel drill-down (drawer/modal) yang menampilkan detail penuh: nilai before/after, sumber request (web, mobile, API), dan field reason/comment.

Filtering adalah apa yang membuat feed bisa digunakan setelah minggu pertama. Fokus pada filter yang menjawab pertanyaan nyata:

  • Aktor (user atau system)
  • Tipe objek (Customers, Orders, Permissions)
  • Jenis aksi (Create/Update/Delete/Restore)
  • Rentang tanggal
  • Pencarian teks (nama atau ID record)

Linking penting, tetapi hanya ketika diizinkan. Jika viewer memiliki akses ke record yang terpengaruh, tampilkan aksi "View record." Jika tidak, tampilkan placeholder aman (mis. "Restricted record") sambil tetap menampilkan entri audit.

Jadikan aksi sistem jelas. Tandai job terjadwal dan integrasi secara berbeda sehingga admin bisa membedakan "Dana menghapusnya" dari "Nightly billing sync memperbaruinya."

Izin dan aturan privasi untuk data audit

Pisahkan manusia dari automatisasi
Lacak staf, job sistem, dan integrasi dengan tipe aktor yang jelas.
Tambah Aktor

Audit log adalah bukti, tetapi juga data sensitif. Perlakukan audit logging seperti produk terpisah di dalam aplikasi Anda: aturan akses yang jelas, batasan yang jelas, dan penanganan data personal yang hati-hati.

Tentukan siapa yang bisa melihat apa. Pembagian umum: admin sistem dapat melihat semuanya; manajer departemen dapat melihat event untuk tim mereka; pemilik record dapat melihat event yang terkait record yang sudah bisa mereka akses (dan tidak lebih). Jika Anda menampilkan feed aktivitas, terapkan aturan yang sama pada setiap baris, bukan hanya layar.

Visibilitas baris penting terutama di alat multi-tenant atau lintas-departemen. Tabel audit Anda harus membawa key scoping yang sama seperti data bisnis (tenant_id, department_id, project_id), sehingga Anda bisa memfilter secara konsisten. Contoh: manajer dukungan harus melihat perubahan pada tiket di antreannya, tetapi bukan penyesuaian gaji di HR, meskipun keduanya terjadi di aplikasi yang sama.

Kebijakan sederhana yang bekerja di praktik:

  • Admin: akses audit penuh lintas tenant dan departemen
  • Manager: akses audit dibatasi oleh department_id atau project_id
  • Pemilik record: akses audit hanya untuk record yang bisa mereka lihat
  • Auditor/Compliance: akses read-only, ekspor diperbolehkan, edit diblokir
  • Semua orang lain: tidak ada akses secara default

Privasi adalah separuh kedua. Simpan cukup untuk membuktikan apa yang terjadi, tetapi hindari menjadikan log sebagai salinan database Anda. Untuk field sensitif (SSN, catatan medis, detail pembayaran), pilih redaksi: catat bahwa field berubah tanpa menyimpan nilai lama/baru. Anda bisa mencatat "email changed" sambil memask nilai aktual, atau menyimpan fingerprint ter-hash untuk verifikasi.

Pisahkan event keamanan dari perubahan record bisnis. Upaya login, reset MFA, pembuatan API key, dan perubahan peran harus masuk ke stream security_audit dengan akses lebih ketat dan retensi lebih lama. Edit bisnis (pembaruan status, persetujuan, perubahan workflow) dapat berada di stream audit umum.

Saat seseorang meminta penghapusan data personal, jangan hapus seluruh jejak audit. Sebaliknya:

  • Hapus atau anonimisasi data profil pengguna
  • Ganti identifier aktor di log dengan pseudonim stabil (mis. "deleted-user-123")
  • Redaksi nilai field yang tersimpan yang merupakan data personal
  • Simpan timestamp, jenis aksi, dan referensi record untuk kepatuhan

Retensi, integritas, dan kinerja untuk kepatuhan

Audit log yang berguna bukan hanya "kita mencatat event." Untuk kepatuhan, Anda perlu membuktikan tiga hal: Anda menyimpan data cukup lama, data tersebut tidak diubah setelah fakta, dan Anda bisa mengambilnya dengan cepat saat diminta.

Retensi: tentukan kebijakan yang bisa Anda jelaskan

Mulailah dengan aturan sederhana yang sesuai risiko Anda. Banyak tim memilih 90 hari untuk troubleshooting sehari-hari, 1 hingga 3 tahun untuk kepatuhan internal, dan lebih lama hanya untuk record yang diatur. Tuliskan apa yang mereset jam (sering: waktu event) dan apa yang dikecualikan (mis. log yang mengandung field yang tidak boleh disimpan).

Jika Anda punya beberapa environment, atur retensi berbeda per environment. Log produksi biasanya membutuhkan retensi terpanjang; log pengujian sering kali tidak perlu apa-apa.

Integritas: buat manipulasi sulit

Perlakukan audit log sebagai append-only. Jangan update baris, dan jangan izinkan admin biasa menghapusnya. Jika penghapusan benar-benar diperlukan (permintaan hukum, pembersihan data), catat aksi itu juga sebagai event tersendiri.

Pola praktis:

  • Hanya server yang menulis event audit, bukan klien
  • Tidak ada izin UPDATE/DELETE pada tabel audit untuk peran biasa
  • Peran "break glass" terpisah untuk tindakan purge yang jarang
  • Snapshot ekspor periodik yang disimpan di luar database aplikasi utama

Ekspor, kinerja, dan monitoring

Auditor sering meminta CSV atau JSON. Rencanakan ekspor yang memfilter berdasarkan rentang tanggal dan tipe objek (mis. Invoice, User, Ticket) supaya Anda tidak sembarangan query database di saat terburuk.

Untuk kinerja, index sesuai pola pencarian Anda:

  • created_at (queries rentang waktu)
  • object_type + object_id (seluruh riwayat satu record)
  • actor_id (siapa melakukan apa)

Waspadai kegagalan senyap. Jika penulisan audit gagal, Anda kehilangan bukti dan seringkali tidak menyadarinya. Tambahkan alert sederhana: jika aplikasi memproses penulisan tetapi event audit turun ke nol untuk suatu periode, beri tahu pemilik dan log error itu dengan jelas.

Kesalahan umum yang membuat audit log tidak berguna

Modelkan data audit dengan cepat
Rancang tabel dan relasi audit secara visual dengan PostgreSQL di pikiran.
Model Data

Cara tercepat membuang waktu adalah mengumpulkan banyak baris yang tidak menjawab pertanyaan nyata: siapa yang mengubah apa, kapan, dan dari mana.

Salah satu perangkap umum adalah mengandalkan trigger database saja. Trigger bisa mencatat bahwa sebuah baris berubah, tetapi seringkali mereka melewatkan konteks bisnis: layar mana yang dipakai user, request apa yang menyebabkannya, peran apa yang mereka miliki, dan apakah itu edit normal atau aturan otomatis.

Kesalahan yang paling sering memecah kepatuhan dan kegunaan sehari-hari:

  • Merekam payload sensitif penuh (reset kata sandi, token, catatan pribadi) alih-alih diff minimal dan identifier aman.
  • Membiarkan orang mengedit atau menghapus record audit "untuk memperbaiki" sejarah.
  • Lupa jalur penulisan non-UI seperti impor CSV, integrasi, dan job background.
  • Menggunakan nama aksi yang tidak konsisten seperti "Updated," "Edit," "Change," "Modify," sehingga feed terbaca seperti kebisingan.
  • Hanya mencatat object ID, tanpa nama ramah-manusia pada saat perubahan (nama berubah nanti).

Standarkan kosakata event Anda sejak awal (mis. user.created, user.updated, invoice.voided, access.granted) dan minta setiap jalur penulisan menerbitkan satu event. Perlakukan data audit sebagai tulis-sekali: jika seseorang membuat perubahan salah, catat aksi koreksi baru daripada menulis ulang sejarah.

Daftar periksa cepat dan langkah berikutnya

Sebelum Anda menyatakan selesai, jalankan beberapa pemeriksaan cepat. Audit log yang baik membosankan dalam arti terbaik: lengkap, konsisten, dan mudah dibaca saat sesuatu salah.

Gunakan daftar periksa ini di environment uji dengan data realistis:

  • Setiap create, update, delete, restore, dan edit massal menghasilkan tepat satu event audit per record yang terpengaruh (tidak ada celah, tidak ada duplikat).
  • Setiap event mencakup aktor (user atau system), timestamp (UTC), aksi, dan referensi objek yang stabil (type + ID).
  • Tampilan "apa yang berubah" dapat dibaca: nama field jelas, nilai lama/baru ditampilkan, dan field sensitif dimask atau dirangkum.
  • Admin bisa memfilter feed aktivitas berdasarkan rentang waktu, aktor, aksi, dan objek, serta mengekspor hasil untuk review.
  • Log sulit dimanipulasi: hanya-tulis untuk sebagian besar peran, dan perubahan pada log audit itu sendiri diblokir atau diaudit terpisah.

Jika Anda membangun alat internal dengan AppMaster (appmaster.io), satu cara praktis untuk menjaga cakupan tinggi adalah merutekan aksi UI, endpoint API, impor, dan automatisasi melalui pola Business Process yang sama yang menulis perubahan data dan event audit. Dengan begitu, jejak audit CRUD Anda tetap konsisten bahkan saat layar dan workflow berubah.

Mulailah kecil dengan satu workflow yang penting (tiket, persetujuan, perubahan tagihan), buat feed aktivitas dapat dibaca, lalu kembangkan hingga setiap jalur penulisan menghasilkan event audit yang dapat diprediksi dan dicari.

FAQ

Kapan kita harus menambahkan audit log ke alat internal?

Tambahkan audit log segera setelah alat itu bisa mengubah data nyata. Sengketa atau permintaan audit biasanya datang lebih awal dari yang Anda kira, dan mengisi sejarah secara retroaktif sebagian besar menjadi tebak-tebakan.

Apa minimum yang harus diberitahu oleh audit log?

Audit log yang berguna bisa menjawab siapa yang melakukannya, record mana yang terpengaruh, apa yang berubah, kapan itu terjadi, dan dari mana asalnya (UI, API, impor, atau job). Jika Anda tidak bisa menjawab salah satu dengan cepat, log tidak akan dipercaya.

Apa perbedaan antara debug log dan audit log?

Debug log dibuat untuk pengembang dan seringkali berisik serta tidak konsisten. Audit log dibuat untuk akuntabilitas, sehingga membutuhkan field yang stabil, kata-kata yang jelas, dan format yang tetap dapat dibaca oleh non-engineer dari waktu ke waktu.

Kenapa audit log bisa bolong walau kita mencatat edit normal?

Cakupan biasanya gagal ketika perubahan terjadi di luar layar edit normal. Edit massal, impor, job terjadwal, jalan pintas admin, dan penghapusan adalah tempat umum di mana tim lupa mengeluarkan peristiwa audit.

Bagaimana kita mencatat aksi yang dilakukan oleh automatisasi atau integrasi?

Simpan tipe aktor dan identifier aktor, bukan hanya user ID. Dengan begitu Anda bisa membedakan antara staf, job sistem, akun layanan, atau integrasi eksternal, dan menghindari ambiguitas “seseorang melakukannya”.

Apakah timestamp audit harus disimpan dalam UTC atau waktu lokal?

Simpan timestamp dalam UTC di database, lalu tampilkan dalam waktu lokal pemirsa di UI admin. Ini mencegah perselisihan zona waktu dan membuat ekspor konsisten antar tim dan sistem.

Haruskah kita menggunakan tabel event log atau versi per-entity?

Gunakan event log append-only ketika Anda ingin satu tempat untuk mencari dan feed aktivitas yang mudah. Gunakan versioned history ketika Anda sering butuh view point-in-time dari satu record; di banyak aplikasi, event log dengan diff per-field menutupi kebutuhan kebanyakan dengan penyimpanan lebih sedikit.

Bagaimana kita menangani delete agar tidak menghapus bukti?

Utamakan soft delete dan catat aksi delete secara eksplisit. Jika harus hard delete, tulis event audit terlebih dahulu dan sertakan snapshot atau field kunci sehingga Anda bisa membuktikan apa yang dihapus nanti.

Bagaimana kita mencatat “apa yang berubah” tanpa menyimpan data sensitif?

Default praktis adalah menyimpan diff per-field untuk update dan snapshot untuk create dan delete. Untuk field sensitif, catat bahwa nilai berubah tanpa menyimpan rahasianya, dan redaksi atau mask data personal agar audit log tidak menjadi salinan kedua database Anda.

Bagaimana kita memastikan setiap jalur penulisan benar-benar menghasilkan event audit?

Buat satu jalur “tulis + audit” bersama dan paksa setiap penulisan menggunakannya, termasuk aksi UI, endpoint API, impor, dan job background. Di AppMaster, tim sering mengimplementasikannya sebagai Business Process yang dapat digunakan ulang yang melakukan perubahan data dan menulis event audit dalam alur yang sama untuk menghindari celah.

Mudah untuk memulai
Ciptakan sesuatu yang menakjubkan

Eksperimen dengan AppMaster dengan paket gratis.
Saat Anda siap, Anda dapat memilih langganan yang tepat.

Memulai
Pencatatan audit untuk alat internal: pola sejarah perubahan yang rapi | AppMaster