26 Mar 2025·7 dk okuma

Dahili araçlar için denetim kayıtları: temiz değişiklik geçmişi kalıpları

Dahili araçlar için denetim kayıtlarını pratik hale getirin: her CRUD değişikliğinde kim neyi ne zaman yaptı takip edin, farkları güvenli saklayın ve yöneticiler için bir etkinlik akışı gösterin.

Dahili araçlar için denetim kayıtları: temiz değişiklik geçmişi kalıpları

Dahili araçların neden denetim kayıtlarına ihtiyacı var (ve genelde nerede başarısız olurlar)

Çoğu ekip bir şey ters gidince denetim kayıtlarını ekler. Bir müşteri bir değişikliği tartışıyor, bir finans rakamı kayıyor veya bir denetçi "Bunu kim onayladı?" diye soruyor. Sadece o zaman başlarsanız, geçmişi kısmi ipuçlarından yeniden oluşturmaya çalışırsınız: veritabanı zaman damgaları, Slack mesajları ve varsayımlar.

Çoğu dahili uygulama için "uyumluluk için yeterli" olmak mükemmel adli bir sistem demek değildir. Küçük bir soru setini hızlı ve tutarlı şekilde cevaplayabilmek demektir: değişikliği kim yaptı, hangi kayıt etkilendi, ne değişti, ne zaman oldu ve nereden geldi (UI, içe aktarma, API, otomasyon). Bu netlik denetim kaydının güvenilir olmasını sağlar.

Denetim günlüklerinin genelde başarısız olduğu yer veritabanı değil, kapsama alanıdır. Geçmiş basit düzenlemelerde iyi görünür, sonra iş hızla yapılmaya başladığında boşluklar ortaya çıkar. Yaygın suçlular: toplu düzenlemeler, içe aktarımlar, zamanlanmış işler, normal ekranları atlayan yönetici eylemleri (şifre sıfırlama veya rol değiştirme gibi) ve silmeler (özellikle hard delete).

Bir diğer sık hata, hata ayıklama günlükleri ile denetim günlüklerini karıştırmaktır. Hata ayıklama günlükleri geliştiriciler içindir: gürültülü, teknik ve genelde tutarsız. Denetim günlükleri hesap verebilirlik içindir: tutarlı alanlar, açık ifadeler ve mühendis olmayanlara gösterilebilecek stabil bir format.

Pratik bir örnek: bir destek müdürü bir müşterinin planını değiştirir, sonra bir otomasyon fatura detaylarını günceller. Sadece "müşteri güncellendi" kaydı varsa, bunu bir kişinin mi, bir iş akışının mı yoksa bir içe aktarımın mı yaptığı anlaşılamaz.

Kim, ne, ne zaman sorularını cevaplayan denetim alanları

İyi denetim kaydı bir hedefle başlar: bir kişi tek bir girdiyi okuyup ne olduğunu tahmin etmeden anlamalı.

Kim yaptı

Her değişiklik için net bir aktör saklayın. Çoğu ekip "kullanıcı id" ile yetinir, ama dahili araçlarda veriler birden fazla kapıdan değiştirilebilir.

Bir aktör tipi ve aktör tanımlayıcısı ekleyin, böylece bir personel, bir servis hesabı veya dış entegrasyon arasındaki farkı görebilirsiniz. Takımlarınız veya kiracılarınız varsa, olayların karışmaması için organizasyon veya çalışma alanı id'sini de saklayın.

Ne oldu ve hangi kayda

Eylemi yakalayın (create, update, delete, restore) ve hedefi belirtin. "Hedef" hem insan tarafından okunur hem de kesin olmalı: tablo veya varlık adı, kayıt id'si ve hızlı tarama için kısa bir etiket (ör. sipariş numarası).

Pratik asgari alan seti:

  • actor_type, actor_id (ve varsa actor_display_name)
  • action ve target_type, target_id
  • happened_at_utc (UTC olarak saklanan zaman damgası)
  • source (ekran, endpoint, iş, import) ve ip_address (gerekiyorsa)
  • reason (hassas değişiklikler için isteğe bağlı not)

Ne zaman oldu

Zaman damgasını UTC olarak saklayın. Hep. Sonra yönetici UI'sinde görüntüleyicinin yerel zamanında gösterin. Bu, inceleme sırasında "iki kişi farklı zamanlar gördü" tartışmalarını önler.

Rol değişiklikleri, iadeler veya veri dışa aktarımları gibi yüksek riskli eylemleri ele alıyorsanız, bir reason alanı ekleyin. Kısa bir not bile ("Ticket 1842'de yönetici onayı") denetim izini gürültüden kanıta çevirebilir.

Veri modelini seçin: olay günlüğü vs sürümlü geçmiş

İlk tasarım seçimi değişiklik geçmişinin "gerçeğinin" nerede tutulacağıdır. Çoğu ekip iki modelden biriyle ilerler: eklenebilir tek bir olay günlüğü veya varlığa özel sürüm geçmiş tabloları.

Seçenek 1: Olay günlüğü (append-only actions table)

Olay günlüğü, her eylemi yeni bir satır olarak kaydeden tek bir tablodur. Her satır kim yaptı, ne zaman oldu, hangi varlığı etkiledi ve değişikliği açıklayan bir payload (çoğunlukla JSON) saklar.

Bu model eklemeyi basit ve veri modeli evrildiğinde esnek kılar. Ayrıca yönetici etkinlik akışına doğal olarak uyar çünkü akış temel olarak "yeni olaylar önde" görünümüdür.

Seçenek 2: Sürümlü geçmiş (varlığa özel versiyonlar)

Sürümlü geçmiş yaklaşımı Order_history veya User_versions gibi varlık bazlı geçmiş tabloları oluşturur; her güncelleme yeni bir tam anlık görüntü (veya yapılandırılmış değişen alanlar seti) ve bir versiyon numarası yaratır.

Bu, belirli bir zamanda kaydın nasıl göründüğünü görmeyi kolaylaştırır ("bu kayıt geçen Salı nasıl görünüyordu?"). Her kaydın zaman çizelgesinin kendi içinde olması denetçiler için daha açık hissi verebilir.

Pratik seçim yolu:

  • Tek bir yerde arama, kolay etkinlik akışları ve yeni varlıklar ortaya çıktığında az sürtünme istiyorsanız olay günlüğünü seçin.
  • Sık sık kayıt düzeyinde zaman noktasına dönük görünümler, veya kolay fark ihtiyaçlarınız varsa sürümlü geçmişi seçin.
  • Depolama bir endişeyse, alan düzeyli farklar içeren olay günlükleri tam anlık görüntülerden genelde daha hafiftir.
  • Raporlama ana amaçsa, sürüm tabloları olay payload'larını parçalayıp sorgulamaktan daha basit olabilir.

Hangi modeli seçerseniz seçin, denetim girdilerini değiştirilemez tutun: güncelleme yok, silme yok. Bir şey yanlışsa, düzeltmeyi açıklayan yeni bir giriş ekleyin.

Ayrıca bir correlation_id (veya operasyon id) eklemeyi düşünün. Bir kullanıcı eylemi genellikle birden fazla değişiklik tetikler (ör. "Kullanıcıyı devre dışı bırak" kullanıcının güncellenmesi, oturumların iptali ve bekleyen görevlerin iptali gibi). Paylaşılan correlation id bu satırları tek okunabilir operasyonda gruplayabilir.

CRUD eylemlerini güvenilir şekilde yakalayın (silme ve toplu düzenlemeler dahil)

Güvenilir denetim kaydı bir kural ile başlar: her yazma işlemi aynı yoldan geçmeli ve aynı zamanda bir denetim olayı yazmalıdır. Bazı güncellemeler arka plan işinde, içe aktarmada veya normal kaydet akışınızı atlayan hızlı düzenleme ekranında oluyorsa, günlüklerinizde delikler olur.

Oluşturmalar için aktörü ve kaynağı (UI, API, import) kaydedin. İçe aktarımlar genelde "kimin yaptığı" bilgisinin kaybedildiği yerdir; dosyadan veya entegrasyondan gelmiş olsa bile açık bir "yapan" değeri saklayın. Ayrıca başlangıç değerlerini (tam bir anlık görüntü veya küçük bir ana alan seti) saklamak kaydın neden var olduğunu açıklamaya yardımcı olur.

Güncellemeler daha karmaşıktır. Sadece değişen alanları kaydedebilirsiniz (küçük, okunabilir ve hızlı), veya her kaydetme sonrası tam bir anlık görüntü saklayabilirsiniz (sonradan sorgulaması basit fakat ağır). Pratik bir orta yol: normal düzenlemeler için diff saklayın, hassas varlıklar (izinler, banka bilgileri, fiyat kuralları gibi) için anlık görüntüler tutun.

Silme kanıtı silmemelidir. Yumuşak silme (soft delete) tercih edin (is_deleted bayrağı artı denetim girişi). Hard delete gerekiyorsa, önce denetim olayını yazın ve kaydın anlık görüntüsünü dahil edin ki neyin kaldırıldığını kanıtlayabilesiniz.

Geri yükleme (undelete) kendi başına bir eylemdir. "Geri yükle" ile "Güncelle" aynı değildir; bunları ayırmak incelemeleri ve uyumluluk kontrollerini kolaylaştırır.

Toplu düzenlemeler için "500 kayıt güncellendi" gibi tek ve belirsiz bir girişi tercih etmeyin. Sonradan "hangi kayıtlar değişti?" sorusunu cevaplayacak kadar detay gerekir. Pratik bir desen: bir üst olay (parent) ve kayıt başına alt olaylar:

  • Üst olay: aktör, kullanılan araç/ekran, uygulanan filtreler ve işlem boyutu
  • Kayıt başına alt olay: kayıt id, önce/sonra (veya değişen alanlar) ve sonuç (başarı/hata)
  • Opsiyonel: ortak bir sebep alanı (politika güncellemesi, temizlik, migrasyon)

Örnek: bir destek lideri 120 bileti topluca kapatır. Üst giriş "status=open, older than 30 days" filtresini yakalar ve her bilet için açık -> kapalı şeklinde bir alt giriş oluşturulur.

Ne değiştiğini saklayın ama gizlilik ve depolama başına bela olmasın

Denetim hazır dahili araçlar inşa edin
Denetim kayıtlarının her iş akışına gömülü olduğu bir dahili araç oluşturun.
İnşa Etmeye Başla

Denetim günlükleri çok hızlı çöp haline gelir: ya çok fazla (her tam kayıt sonsuza kadar) ya çok az (sadece "kullanıcı düzenlendi") saklanır. Amaç uyumluluk için savunulabilir ve yöneticinin okuyabileceği bir kayıt tutmaktır.

Pratik bir varsayılan, çoğu güncelleme için alan düzeyinde diff saklamaktır. Sadece değişen alanları, "önce" ve "sonra" değerleriyle kaydedin. Bu depolamayı düşük tutar ve etkinlik akışını taramayı kolaylaştırır: "Durum: Beklemede -> Onaylandı" büyük bir blob'dan daha açıktır.

Ana anlar için tam anlık görüntüler tutun: oluşturma, silme ve önemli iş akışı geçişleri. Anlık görüntü ağırdır ama biri "müşteri profili kaldırılmadan önce tam olarak nasıldı?" dediğinde sizi korur.

Hassas veriler için maskeleme kuralları uygulayın; aksi halde denetim tablonuz sırlarla dolu ikinci bir veritabanına dönüşür. Yaygın kurallar:

  • Şifreleri, API token'ları veya özel anahtarları asla saklamayın (sadece "değiştirildi" kaydedin)
  • E-posta/telefon gibi kişisel verileri maskelenmiş veya kısmi/hashed olarak saklayın
  • Notlar veya serbest metin alanları için kısa önizleme ve "değişti" bayrağı saklayın
  • İlgili nesnelerin tamamını kopyalamak yerine referanslar (user_id, order_id) kaydedin

Şema değişiklikleri denetim geçmişini bozabilir. Bir alan daha sonra yeniden adlandırılır veya kaldırılırsa, orijinal alan anahtarını saklayarak güvenli bir geri dönüş değeri ekleyin (ör. "bilinmeyen alan") . Silinmiş alanlar için son bilinen değeri saklayın ama "alan şemadan kaldırıldı" olarak işaretleyin ki akış dürüst kalsın.

Son olarak, girdileri insan-dostu yapın. Ham anahtarların ("assignee_id") yanında gösterim etiketleri ("Atanan kişiye") saklayın ve değerleri (tarihler, para birimleri, durum adları) formatlayın.

Adım adım desen: uygulamanızın akışlarında denetim kaydını uygulayın

Güvenilir bir denetim izi daha fazla günlük tutmakla ilgili değildir. Her yerde tekrarlanabilir bir desen kullanmakla ilgilidir; aksi takdirde "toplu import kaydedilmedi" veya "mobil düzenlemeler anonim görünüyor" gibi boşluklar oluşur.

1) Denetim verisini bir kez modelleyin

Veri modelinizde başlayın ve herhangi bir değişikliği tanımlayabilecek küçük bir tablo seti oluşturun.

Basit tutun: olay için bir tablo, değişen alanlar için bir tablo ve küçük bir aktör bağlamı.

  • 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 (veya audit_event üzerinde alanlar): actor_type (user/system), actor_id, actor_email, ip, user_agent

2) Paylaşılan bir "Yaz + Denetim" alt-akışı ekleyin

Yeniden kullanılabilir bir alt-akış oluşturun ki:

  1. Varlık adı, varlık id, eylem ve önce/sonra değerleri kabul etsin.
  2. İş değişikliğini ana tabloya yazsın.
  3. Bir audit_event kaydı oluştursun.
  4. Değişen alanları hesaplayıp audit_event_item satırlarını eklesin.

Kural kesin: her yazma yolu bu aynı alt-akışı çağırmalı. Bu UI düğmeleri, API uç noktaları, zamanlanmış otomasyonlar ve entegrasyonlar için geçerlidir.

3) Aktörü ve zamanı sunucuda oluşturun

"Kim" ve "ne zaman" için tarayıcıya güvenmeyin. Aktörü kimlik doğrulama oturumunuzdan okuyun ve zaman damgalarını sunucuda üretin. Bir otomasyon çalışıyorsa actor_typesystem olarak ayarlayın ve iş adını aktör etiketi olarak saklayın.

4) Bir somut senaryo ile test edin

Tek bir kayıt seçin (ör. bir müşteri bileti): oluşturun, iki alan (durum ve atanan kişi) düzenleyin, silin, sonra geri yükleyin. Denetim akışınız beş olay göstermeli; düzenleme olayının altında iki güncelleme öğesi olmalı ve aktör ile zaman damgası her seferinde aynı biçimde doldurulmuş olmalı.

İnsanların gerçekten kullanacağı bir yönetici etkinlik akışı oluşturun

Kullanışlı bir etkinlik akışı yayınlayın
Denetim olaylarını ekibinizin gerçekten kullanacağı okunabilir bir yönetici etkinlik akışına dönüştürün.
Akışı Oluştur

Denetim kaydı, biri bir inceleme veya olay sırasında hızlıca okuyabilirse işe yarar. Yönetici akışının hedefi basittir: "ne oldu?" sorusunu bir bakışta cevaplayabilmek ve sonra ham JSON içinde boğmadan daha derine bakabilmektir.

Zaman çizelgesi düzeniyle başlayın: en yeni ilk, olay başına bir satır ve Açık fiiller: Oluşturuldu, Güncellendi, Silindi, Geri Yüklendi. Her satır aktörü (kişi veya sistem), hedefi (kayıt türü ve insan-dostu isim) ve zamanı göstermeli.

Pratik satır formatı:

  • Fiil + nesne: "Müşteri Güncellendi: Acme Co."
  • Aktör: "Maya (Destek)" veya "Sistem: Gece Senkronizasyonu"
  • Zaman: mutlak zaman damgası (saat dilimi ile)
  • Değişiklik özeti: "durum: Beklemede -> Onaylandı, limit: 5.000 -> 7.500"
  • Etiketler: Updated, Deleted, Integration, Job

"Ne değişti"yi kompakt tutun. Satır içi 1-3 alan gösterin, ardından tam detayları açan bir panel (drawer/modal) sunun: önce/sonra değerleri, istek kaynağı (web, mobil, API) ve sebep/yorum alanı.

Filtreleme, akışı ilk haftadan sonra kullanılabilir kılan şeydir. Gerçek sorulara uyan filtrelere odaklanın:

  • Aktör (kullanıcı veya sistem)
  • Nesne türü (Müşteriler, Siparişler, İzinler)
  • Eylem türü (Create/Update/Delete/Restore)
  • Tarih aralığı
  • Metin araması (kayıt adı veya ID)

Bağlantılar önemli ama yalnızca yetki varsa. Görüntüleyenin etkilenen kayda erişimi varsa "Kaydı görüntüle" eylemi gösterin. Yoksa güvenli bir yer tutucu (ör. "Kısıtlı kayıt") gösterin fakat denetim girdisini görünür tutun.

Sistem eylemlerini belirgin yapın. Zamanlanmış işler ve entegrasyonları açıkça etiketleyin ki yöneticiler "Dana silmiş" ile "Gece faturalandırma senkronizasyonu güncelledi" arasında ayrım yapabilsin.

Denetim verisi için izinler ve gizlilik kuralları

Denetim günlüklerini gizlilik odaklı tutun
Kayıtları güvenli tutmak için farkları kaydederken hassas değerleri kırpın.
Alanları Maskeleyin

Denetim günlükleri kanıttır ama aynı zamanda hassas veridir. Denetim kaydını uygulama içinde ayrı bir ürün gibi yönetin: net erişim kuralları, net sınırlar ve kişisel verilerin dikkatli işlenmesi.

Kimlerin neyi görebileceğine karar verin. Yaygın bir ayrım: sistem yöneticileri her şeyi görebilir; bölüm yöneticileri kendi takımlarına ait olayları görebilir; kayıt sahipleri yalnızca zaten erişebildikleri kayıtlara ait olayları görebilir. Etkinlik akışı görüntülerseniz, aynı erişim kurallarını tüm satırlara uygulayın.

Satır düzeyinde görünürlük çok önemlidir, özellikle çok kiracılı veya bölüm bazlı araçlarda. Denetim tablonuz iş verisiyle aynı kapsam anahtarlarını taşımalı (tenant_id, department_id, project_id) ki tutarlı filtreleme yapabilesiniz. Örnek: bir destek müdürü kendi kuyruklarındaki bilet değişikliklerini görmeli ama HR'daki maaş değişikliklerini görmemeli.

Pratik bir politika:

  • Admin: tenant ve departman fark etmeksizin tam denetim erişimi
  • Yönetici: department_id veya project_id ile sınırlı denetim erişimi
  • Kayıt sahibi: yalnızca görüntüleyebildikleri kayıtlara ait denetim erişimi
  • Denetçi/uyumluluk: salt okunur erişim, dışa aktarıma izin, düzenlemeye engel
  • Diğer herkes: varsayılan olarak erişim yok

Gizlilik ikinci yarıdır. Kanıtlamak için yeterince saklayın ama günlükleri veritabanınızın kopyasına dönüştürmekten kaçının. Hassas alanlar (SSN, tıbbi notlar, ödeme detayları) için redaksiyon tercih edin: alanın değiştiğini kaydederken eski/ yeni değeri saklamayın. E-postanın değiştiğini kaydederken gerçek değeri gizleyin veya doğrulama için hashed parmak izi saklayın.

Güvenlik olaylarını iş düzeni değişikliklerinden ayrı tutun. Giriş denemeleri, MFA sıfırlamaları, API anahtarı oluşturma ve rol değişiklikleri daha sıkı erişim ve daha uzun saklama ile security_audit akışına girebilir. İş düzeni değişiklikleri genel denetim akışında kalabilir.

Birisi kişisel veri kaldırma talep ettiğinde, tüm denetim izini silmeyin. Onun yerine:

  • Kullanıcı profili verilerini silin veya anonimleştirin
  • Günlüklerdeki aktör tanımlayıcılarını kararlı bir takma adla değiştirin (ör. "deleted-user-123")
  • Kayıtlardaki kişisel veri barındıran alanları redakte edin
  • Uyumluluk için zaman damgalarını, eylem türlerini ve kayıt referanslarını saklayın

Saklama, bütünlük ve uyumluluk için performans

Yararlı bir denetim günlüğü sadece "olayları kaydediyoruz" demek değildir. Uyumluluk için üç şeyi kanıtlamanız gerekir: veriyi yeterince uzun tuttunuz, sonradan değiştirilemezdi ve gerektiğinde hızlıca geri getirebiliyorsunuz.

Saklama: açıklayabileceğiniz bir politika belirleyin

Riskinize uygun basit bir kuralla başlayın. Birçok ekip günlük sorun çözme için 90 gün, dahili uyumluluk için 1-3 yıl ve düzenlemeye tabi kayıtlar için daha uzun süre seçer. Hangi olayın zamanı saatin sıfırladığı (çoğunlukla: event time) ve nelerin hariç olduğunu yazın (ör. saklanmaması gereken alanlar içeren loglar).

Farklı ortamlar için farklı saklama süreleri belirleyin. Üretim günlükleri genelde en uzun saklamayı gerektirir; test günlükleri çoğunlukla tutulmaz.

Bütünlük: kurcalamayı zorlaştırın

Denetim günlüklerini eklenebilir (append-only) olarak ele alın. Satırları güncellemeyin ve normal yöneticilerin bunları silmesine izin vermeyin. Bir silme gerçekten gerekliyse (yasal talep, veri temizliği), o eylemi de ayrı bir olay olarak kaydedin.

Pratik desen:

  • Sadece sunucu denetim olaylarını yazar, asla istemci yazmaz
  • Normal roller için denetim tablosunda UPDATE/DELETE izinleri yok
  • Nadir temizlik işlemleri için ayrı "break glass" rolü
  • Periyodik dışa aktarılan snapshot'lar uygulama veritabanı dışında saklanır

Dışa aktarımlar, performans ve izleme

Denetçiler genelde CSV veya JSON ister. Tarih aralığı ve nesne türüne göre filtrelenen bir dışa aktarma planlayın ki en kötü zamanda veritabanına elle sorgu çekmek zorunda kalmayın.

Performans için aradığınız alanlara göre indeksleyin:

  • created_at (zaman aralığı sorguları)
  • object_type + object_id (bir kaydın tüm geçmişi)
  • actor_id (kim ne yaptı)

Sessiz başarısızlıklara dikkat edin. Denetim yazımı hataya düşerse kanıt kaybedersiniz ve genelde fark etmezsiniz. Basit bir uyarı ekleyin: uygulama yazma yapıyorsa ama belirli bir süre için denetim olayları sıfıra düşerse sahipleri bilgilendirin ve hatayı yüksek sesle loglayın.

Denetim günlüklerini işe yaramaz yapan yaygın hatalar

Her yazma yolunu kapsayın
UI, API, içe aktarımlar ve işler için tek bir Yaz + Denetim akışından yönlendirin.
AppMaster'ı Deneyin

Zaman kaybetmenin en hızlı yolu gerçek soruları cevaplamayan çok sayıda satır toplamaktır: kim neyi ne zaman ve nereden değiştirdi.

Veritabanı trigger'larına aşırı güvenmek bir tuzaktır. Trigger'lar bir satırın değiştiğini kaydedebilir ama hangi ekranın kullanıldığı, isteği tetikleyen rol, bunun normal bir düzenleme mi yoksa otomatik bir kural mı olduğu gibi iş bağlamını genelde kaçırırlar.

Sıklıkla uyumluluğu ve kullanılabilirliği bozan hatalar:

  • Hassas yükleri (şifre sıfırlamalar, token'lar, özel notlar) tam payload ile kaydetmek yerine minimal diff ve güvenli tanımlayıcılar saklamamak.
  • İnsanların denetim kayıtlarını "düzeltmek" için düzenlemesine izin vermek.
  • CSV içe aktarımlar, entegrasyonlar ve arka plan işleri gibi UI dışı yazma yollarını unutmak.
  • "Updated", "Edit", "Change", "Modify" gibi tutarsız eylem isimleri kullanmak, akışın okunmasını zorlaştırır.
  • Sadece nesne ID'sini kaydetmek; insan-dostu nesne adını değişiklik anında kaydetmemek (isimler daha sonra değişir).

Olay sözlüğünüzü erken standartlaştırın (ör. user.created, user.updated, invoice.voided, access.granted) ve her yazma yolunun bir olay yayınlamasını zorunlu kılın. Denetim verisini yazıldıktan sonra değiştirilmemesi gereken yazma-bir-kez (write-once) veri olarak ele alın: biri yanlış değişiklik yaptıysa yeni bir düzeltici eylem kaydedin, geçmişi yeniden yazmayın.

Hızlı kontrol listesi ve sonraki adımlar

Bitirdi demeden önce birkaç hızlı kontrol yapın. İyi bir denetim günlüğü en iyi şekilde sıkıcıdır: eksiksiz, tutarlı ve bir şey ters gittiğinde kolay okunur.

Test ortamında gerçekçi verilerle bu kontrol listesini kullanın:

  • Her create, update, delete, restore ve toplu düzenleme etkilenen her kayıt için tam olarak bir denetim olayı üretir (boşluk yok, tekrar yok).
  • Her olay aktörü (kullanıcı veya sistem), zaman damgası (UTC), eylem ve sabit bir nesne referansı (tür + ID) içerir.
  • "Ne değişti" görünümü okunabilir: alan adları net, eski/yeni değerler gösterilmiş ve hassas alanlar maskelenmiş veya özetlenmiş.
  • Yöneticiler etkinlik akışını zaman aralığına, aktöre, eyleme ve nesneye göre filtreleyebilir ve incelemeler için sonuçları dışa aktarabilir.
  • Günlüğü karartmak zor: çoğu rol için yazma-yalnız, ve denetim günlüğündeki değişiklikler ya engellenmiş ya da ayrı olarak denetlenir.

Dahili araçlar geliştiriyorsanız AppMaster (appmaster.io) kullanarak kapsama alanını yüksek tutmanın pratik bir yolu, UI eylemlerini, API uç noktalarını, içe aktarımları ve otomasyonları aynı İş Süreci deseninden geçirip hem veri değişikliğini hem de denetim olayını aynı akışta yazmaktır. Böylece CRUD denetim izi ekranlar ve iş akışları değişse bile tutarlı kalır.

Bir akışla başlayın: bir workflow seçin (biletler, onaylar, faturalama değişiklikleri) ve etkinlik akışını okunur hale getirin; sonra her yazma yolunun öngörülebilir, aranabilir bir denetim olayı üretmesini sağlayana kadar genişletin.

SSS

Dahili bir araca ne zaman denetim kayıtları eklemeliyiz?

Araç gerçek veriyi değiştirebildiği anda denetim kayıtları ekleyin. İlk anlaşmazlık veya denetim isteği genellikle "hazır" olduğunuzu düşündüğünüzden önce gelir ve geçmişi sonradan doldurmak çoğunlukla tahmine dayanır.

Bir denetim günlüğü en azından bize ne söylemeli?

Yararlı bir denetim kaydı kim yaptı, hangi kayda dokunuldu, ne değişti, ne zaman oldu ve nereden geldi (UI, API, içe aktarma veya iş) sorularına cevap verebilmelidir. Bunlardan biri hızlıca cevaplanamıyorsa günlük güvenilir olmaz.

Debug günlükleri ile denetim günlükleri arasındaki fark nedir?

Hata ayıklama (debug) günlükleri geliştiriciler içindir ve genellikle gürültülüdür ve tutarsız olabilir. Denetim günlükleri sorumluluk içindir: sabit alanlar, açık ifadeler ve zaman içinde mühendis olmayanların da okuyabileceği bir format gerekir.

Normal düzenlemeleri kaydetmemize rağmen denetim günlüklerinde neden boşluklar oluyor?

Normal düzenlemeler kaydedilse bile boşluklar genellikle değişikliklerin normal düzenleme ekranı dışında gerçekleştiği yerlerde ortaya çıkar. Toplu düzenlemeler, içe aktarımlar, zamanlanmış işler, yöneticinin kısa yolları ve silmeler en yaygın unutulan yerlerdir.

Otomasyonlar veya entegrasyonlar tarafından yapılan eylemleri nasıl kaydetmeliyiz?

Sadece bir kullanıcı kimliği saklamak yerine bir aktör tipi ve aktör kimliği saklayın. Böylece bir personeli, sistem işini, hizmet hesabını veya harici entegrasyonu açıkça ayırabilirsiniz ve ‘‘birisi yaptı’’ belirsizliğinden kaçınırsınız.

Denetim zaman damgalarını UTC mi yoksa yerel saatle mi saklamalıyız?

Zaman damgalarını veritabanında UTC olarak saklayın, ardından yönetici arabiriminde görüntüleyicinin yerel zamanına göre gösterin. Bu, saat dilimi tartışmalarını önler ve dışa aktarımları tutarlı kılar.

Olay günlüğü tablosu mu yoksa varlığa özel sürüm geçmişi mi kullanmalıyız?

Tek bir yerde arama ve kolay etkinlik akışı istiyorsanız eklenebilir olay günlüğü (append-only event log) kullanın. Tek kayıt için zaman noktasına dönük görünümler sık yapılıyorsa ve kolay fark almak istiyorsanız sürümlü geçmiş (versioned history) kullanın. Pek çok uygulamada alan düzeyinde farklar içeren bir olay günlüğü çoğu ihtiyacı daha az depolama ile karşılar.

Delere nasıl yaklaşmalıyız ki kanıt silinmesin?

Kanıt silinmesin diye önce soft delete tercih edin (ör. is_deleted bayrağı ve denetim girişi). Zorunlu olarak hard delete yapmanız gerekiyorsa önce denetim olayını yazın ve kaldırılan kaydın anlık görüntüsünü veya ana alanlarını ekleyin.

Hassas verileri saklamadan "ne değişti" bilgisini nasıl kaydederiz?

Güncelleme için varsayılan pratik: çoğu güncelleme için alan düzeyinde farkları saklayın ve oluşturma/silme gibi anlarda tam anlık görüntüler tutun. Hassas alanlar için ise değerin değiştiğini kaydederken gerçeği saklamaktan kaçının; gizleme veya kırpma uygulayın.

Her yazma yolunun gerçekten denetim olayı üretmesini nasıl sağlarız?

Tek bir paylaşılan "yaz + denetim" yolu oluşturun ve tüm yazma yollarının bunun üzerinden gitmesini zorunlu kılın: UI düğmeleri, API uç noktaları, içe aktarımlar ve arka plan işleri. AppMaster'da takımlar genellikle bu akışı bir İş Süreci olarak uygularlar, böylece veri değişikliği ve denetim olayı aynı akışta yazılır.

Başlaması kolay
Harika bir şey yaratın

Ücretsiz planla AppMaster ile denemeler yapın.
Hazır olduğunuzda uygun aboneliği seçebilirsiniz.

Başlayın