İçeriğe geç

Dokümantasyon

Ne yakalanır, ne süreçten hiç çıkmaz.

Yakalama sizin SaveChanges çağrınızın içinde çalışır; bu yüzden ne yapabileceğine dair kurallar buradaki her şeyden katıdır.

Maskeleme

Maskeler, hiçbir şey tamponlanmadan önce sizin sürecinizde çalışır. Alan bazında öznitelikle ya da aynı alan birçok varlıkta geçiyorsa model genelinde ada göre tanımlayabilirsiniz.

// Per property
[AuditMask(MaskStrategy.PreserveLast, 4)]   // ************4242
[AuditMask(MaskStrategy.Hash)]              // sha256:9f2b1c74a0e8…
[AuditMask(MaskStrategy.Email)]             // e***@contoso.com
[AuditMask(MaskStrategy.Length)]            // ***(16)
[AuditMask]                                // ***

// Model-wide, by property name
options.MaskProperty("NationalId", MaskStrategy.Hash);
options.IgnoreProperty("PasswordHash");
Özet (hash) stratejisi kalıcı bir gizli anahtar ister. Anahtar verilmezse her süreç kendi anahtarını üretir, yeniden başlatmalar arasında özetler eşleşmez ve “bu kimliği taşıyan tüm kayıtları bul” sessizce çalışmaz hâle gelir — aylar sonra, bir soruşturma sırasında ortaya çıkan türden bir arıza.

Yapay zekâ ajanını kaydetme

Değişikliği bir kişi değil bir model yaptığında kayıt bunu söylemelidir. Ajanı kapsama verin; kaydın ürettiği her değişiklik onu taşısın — bir ajana özellik değil görev verilir ve tek bir koşu altı kaydı birden değiştirebilir.

using (AuditScope.Push(new AuditContext
{
    Actor = new AuditActor(user.Id, "user", user.FullName),

    Agent = new AuditAgent(
        "claude-opus-5",
        ModelVersion: "2026-05-01",
        Tool:         "issue_refund",
        Decision:     AuditAgent.Approved,
        OnBehalfOf:   user.Id),

    Payload = AuditPayload.Create(prompt, answer),
}))
{
    // Every change in here is attributed to the agent.
    await db.SaveChangesAsync(ct);
}
Ajan, aktörün yerine değil yanına yazılır. Aktör, sorumluluğu taşıyan kişi olarak kalır: koşuyu başlatan operatör ya da ajanın çalıştığı servis hesabı. İkisini tek alanda birleştirmek "bir insan devrede miydi" sorusunu yanıtsız bırakırdı ve Madde 14 tam da bunu sorar.
autonomousAjan kendi başına hareket etti.
suggestedAjan önerdi; değişikliği başka bir şey gerçekleştirdi.
approvedBir kişi, değişiklik olmadan önce onayladı.

İstem ve yanıt, değişiklik kümesinin dışında, kendi sütunlarında ve bir özellik değerine tanınandan çok daha geniş bir sınırla saklanır. Madde 12 girdi verisini ve sonucu ister; yarım bir istem, sisteme ne sorulduğu hakkında hiçbir şey kanıtlamaz. Özet her zaman, hiçbir şey kısaltılmadan önce her iki tarafın tamamı üzerinden alınır — böylece kısaltılmış bir kayıt, başka yerde tutulan tam bir kopyayla eşleştirilebilir.

SIEM’inize istemin kendisi değil yalnızca özetleri ve uzunlukları iletilir. SIEM indekslenir, çoğaltılır ve kurum içinde geniş biçimde okunabilir; olay başına çeyrek megabaytlık model girdisini oraya aynalamak kimsenin istemediği bir maliyet ve ifşadır.

Ayar referansı

OptionDefault
CaptureModeOptOutOptOut, [AuditIgnore] ile işaretlenmemiş her şeyi denetler. OptIn yalnızca [AuditInclude] ile işaretlenenleri denetler.
MaskHashSecretÖzet stratejisinin anahtarı. Tüm sunucularda birebir aynı olmalıdır.
IncludeShadowPropertiestrueEF gölge alanlarını (örneğin yabancı anahtarlar) kaydeder. Değişen bir MusteriId genellikle kayda değerdir.
CaptureFullSnapshotOnCreatetrueYeni bir kaydın ilk hâlinin tamamını kaydeder.
MaxValueLength4096Daha uzun metin değerleri işaretle birlikte kırpılır.
BufferCapacity10000İstemci yük atmaya başlamadan önce tutulan olay sayısı.
MaxBatchSize500İstek başına olay sayısı.
FlushInterval2snYarım dolu bir paketin gönderilmeden önce beklediği süre.

Diğer diller

Node.js, Python ve Go istemcileri .NET SDK'sıyla aynı belgeyi gönderir. ORM kancası yerine elle yakalarlar ve her biri yalnızca gerçekten değişen alanları kaydeden bir diff yardımcısı içerir.

// Node.js — npm install @reldavi/client
import { ReldaviClient, mask, diff } from '@reldavi/client';

const audit = new ReldaviClient({
  endpoint: 'https://ingest.reldavi.com',
  apiKey: process.env.RELDAVI_API_KEY,
});

audit.capture({
  action: 'updated',
  resourceType: 'shop.order',
  resourceId: order.id,
  actor: { id: user.id, displayName: user.name, ip: req.ip },
  changes: mask.applyMasks(diff(before, after), {
    cardNumber: mask.preserveLast(4),
  }),
});

await audit.close();   // on shutdown

Sırada ne okunur

Bir yerde takıldınız mı?

Şema, SDK kaynakları ve mimari notların tamamı açıktır. Bir şey belirsizse, bu bizim dokümantasyonumuzdaki bir hatadır. Bize yazın.