[{"data":1,"prerenderedAt":1803},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-audit-recipes":439,"-use-cases-audit-recipes-surround":1798},[4,30,80,245,353,408],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"Integrate","\u002Fintegrate","3.integrate",[85,89,157],{"title":36,"path":86,"stem":87,"icon":88},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":90,"path":91,"stem":92,"children":93,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[94,97,137],{"title":36,"path":95,"stem":96,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":98,"path":99,"stem":100,"children":101,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[102,107,112,117,122,127,132],{"title":103,"path":104,"stem":105,"icon":106},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":108,"path":109,"stem":110,"icon":111},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":113,"path":114,"stem":115,"icon":116},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":118,"path":119,"stem":120,"icon":121},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":123,"path":124,"stem":125,"icon":126},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":128,"path":129,"stem":130,"icon":131},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":133,"path":134,"stem":135,"icon":136},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":138,"path":139,"stem":140,"children":141,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[142,147,152],{"title":143,"path":144,"stem":145,"icon":146},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":148,"path":149,"stem":150,"icon":151},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":153,"path":154,"stem":155,"icon":156},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","3.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":158,"path":159,"stem":160,"children":161,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[162,166,171,176,181,186,191,196,201,206,211,216,221,226,230,235,240],{"title":36,"path":163,"stem":164,"icon":165},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":167,"path":168,"stem":169,"icon":170},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":172,"path":173,"stem":174,"icon":175},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":177,"path":178,"stem":179,"icon":180},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":182,"path":183,"stem":184,"icon":185},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":187,"path":188,"stem":189,"icon":190},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":192,"path":193,"stem":194,"icon":195},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":197,"path":198,"stem":199,"icon":200},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":202,"path":203,"stem":204,"icon":205},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":207,"path":208,"stem":209,"icon":210},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":212,"path":213,"stem":214,"icon":215},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":217,"path":218,"stem":219,"icon":220},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":222,"path":223,"stem":224,"icon":225},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":227,"path":228,"stem":229,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":231,"path":232,"stem":233,"icon":234},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":236,"path":237,"stem":238,"icon":239},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","3.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":241,"path":242,"stem":243,"icon":244},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":246,"path":247,"stem":248,"children":249,"page":29},"Use Cases","\u002Fuse-cases","4.use-cases",[250,254,259,288,316,348],{"title":36,"path":251,"stem":252,"icon":253},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":255,"path":256,"stem":257,"icon":258},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":260,"icon":261,"path":262,"stem":263,"children":264,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[265,268,273,278,283],{"title":36,"path":266,"stem":267,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":269,"path":270,"stem":271,"icon":272},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":274,"path":275,"stem":276,"icon":277},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":279,"path":280,"stem":281,"icon":282},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":284,"path":285,"stem":286,"icon":287},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":289,"icon":290,"path":291,"stem":292,"children":293,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[294,297,302,307,311],{"title":36,"path":295,"stem":296,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":298,"path":299,"stem":300,"icon":301},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":303,"path":304,"stem":305,"icon":306},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":308,"path":309,"stem":310,"icon":258},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":312,"path":313,"stem":314,"icon":315},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":317,"icon":318,"path":319,"stem":320,"children":321,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[322,325,330,335,340,344],{"title":36,"path":323,"stem":324,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":326,"path":327,"stem":328,"icon":329},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":331,"path":332,"stem":333,"icon":334},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":336,"path":337,"stem":338,"icon":339},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":341,"path":342,"stem":343,"icon":318},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":345,"path":346,"stem":347,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":349,"path":350,"stem":351,"icon":352},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":354,"path":355,"stem":356,"children":357,"page":29},"Extend","\u002Fextend","5.extend",[358,362,367,372,377,381,385,389,393,398,403],{"title":36,"path":359,"stem":360,"icon":361},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":363,"path":364,"stem":365,"icon":366},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":368,"path":369,"stem":370,"icon":371},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":373,"path":374,"stem":375,"icon":376},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":345,"path":378,"stem":379,"icon":380},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":382,"path":383,"stem":384,"icon":361},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":386,"path":387,"stem":388,"icon":352},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":390,"path":391,"stem":392,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":394,"path":395,"stem":396,"icon":397},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":399,"path":400,"stem":401,"icon":402},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":404,"path":405,"stem":406,"icon":407},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":409,"path":410,"stem":411,"children":412,"page":29},"Reference","\u002Freference","6.reference",[413,418,421,426,430,435],{"title":414,"path":415,"stem":416,"icon":417},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":312,"path":419,"stem":420,"icon":315},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":422,"path":423,"stem":424,"icon":425},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":427,"path":428,"stem":429,"icon":318},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":431,"path":432,"stem":433,"icon":434},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":436,"path":437,"stem":438,"icon":352},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":440,"title":441,"body":442,"description":1787,"extension":1788,"links":1789,"meta":1794,"navigation":1795,"path":346,"seo":1796,"stem":347,"__hash__":1797},"docs\u002F4.use-cases\u002F4.audit\u002F06.recipes.md","Recipes & Reference",{"type":443,"value":444,"toc":1780},"minimark",[445,462,467,694,705,709,927,930,934,1239,1249,1253,1259,1558,1569,1573,1770,1776],[446,447,448,449,453,454,457,458,461],"p",{},"Pick the recipe that matches your sink, drop it in, and you have a tamper-evident audit log. Each recipe composes the same primitives (",[450,451,452],"code",{},"auditOnly",", ",[450,455,456],{},"signed",", optional ",[450,459,460],{},"await: true",") over different drains.",[463,464,466],"h2",{"id":465},"audit-logs-on-disk","Audit logs on disk",[468,469,470,676],"code-group",{},[471,472,478],"pre",{"className":473,"code":474,"filename":475,"language":476,"meta":477,"style":477},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { auditOnly, signed } from 'evlog'\nimport { createFsDrain } from 'evlog\u002Ffs'\n\nnitro.hooks.hook('evlog:drain', auditOnly(\n  signed(createFsDrain({ dir: '.audit', maxFiles: 30 }), { strategy: 'hash-chain' }),\n  { await: true },\n))\n","Input — server\u002Fplugins\u002Fevlog.ts","typescript","",[450,479,480,519,540,547,583,652,670],{"__ignoreMap":477},[481,482,485,489,493,497,500,503,506,509,512,516],"span",{"class":483,"line":484},"line",1,[481,486,488],{"class":487},"s7zQu","import",[481,490,492],{"class":491},"sMK4o"," {",[481,494,496],{"class":495},"sTEyZ"," auditOnly",[481,498,499],{"class":491},",",[481,501,502],{"class":495}," signed",[481,504,505],{"class":491}," }",[481,507,508],{"class":487}," from",[481,510,511],{"class":491}," '",[481,513,515],{"class":514},"sfazB","evlog",[481,517,518],{"class":491},"'\n",[481,520,522,524,526,529,531,533,535,538],{"class":483,"line":521},2,[481,523,488],{"class":487},[481,525,492],{"class":491},[481,527,528],{"class":495}," createFsDrain",[481,530,505],{"class":491},[481,532,508],{"class":487},[481,534,511],{"class":491},[481,536,537],{"class":514},"evlog\u002Ffs",[481,539,518],{"class":491},[481,541,543],{"class":483,"line":542},3,[481,544,546],{"emptyLinePlaceholder":545},true,"\n",[481,548,550,553,556,559,561,565,568,571,574,576,578,580],{"class":483,"line":549},4,[481,551,552],{"class":495},"nitro",[481,554,555],{"class":491},".",[481,557,558],{"class":495},"hooks",[481,560,555],{"class":491},[481,562,564],{"class":563},"s2Zo4","hook",[481,566,567],{"class":495},"(",[481,569,570],{"class":491},"'",[481,572,573],{"class":514},"evlog:drain",[481,575,570],{"class":491},[481,577,499],{"class":491},[481,579,496],{"class":563},[481,581,582],{"class":495},"(\n",[481,584,586,589,591,594,596,599,603,606,608,611,613,615,618,620,624,626,629,631,633,636,638,640,643,645,647,649],{"class":483,"line":585},5,[481,587,588],{"class":563},"  signed",[481,590,567],{"class":495},[481,592,593],{"class":563},"createFsDrain",[481,595,567],{"class":495},[481,597,598],{"class":491},"{",[481,600,602],{"class":601},"swJcz"," dir",[481,604,605],{"class":491},":",[481,607,511],{"class":491},[481,609,610],{"class":514},".audit",[481,612,570],{"class":491},[481,614,499],{"class":491},[481,616,617],{"class":601}," maxFiles",[481,619,605],{"class":491},[481,621,623],{"class":622},"sbssI"," 30",[481,625,505],{"class":491},[481,627,628],{"class":495},")",[481,630,499],{"class":491},[481,632,492],{"class":491},[481,634,635],{"class":601}," strategy",[481,637,605],{"class":491},[481,639,511],{"class":491},[481,641,642],{"class":514},"hash-chain",[481,644,570],{"class":491},[481,646,505],{"class":491},[481,648,628],{"class":495},[481,650,651],{"class":491},",\n",[481,653,655,658,661,663,667],{"class":483,"line":654},6,[481,656,657],{"class":491},"  {",[481,659,660],{"class":601}," await",[481,662,605],{"class":491},[481,664,666],{"class":665},"sfNiH"," true",[481,668,669],{"class":491}," },\n",[481,671,673],{"class":483,"line":672},7,[481,674,675],{"class":495},"))\n",[471,677,682],{"className":678,"code":679,"filename":680,"language":681,"meta":477,"style":477},"language-ndjson shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\"audit\":{\"action\":\"invoice.refund\",\"actor\":{\"type\":\"user\",\"id\":\"usr_42\"},\"target\":{\"type\":\"invoice\",\"id\":\"inv_889\"},\"outcome\":\"success\",\"version\":1,\"idempotencyKey\":\"ak_8f3c4b2a1e5d6f7c\",\"prevHash\":null,\"hash\":\"3f2c8e1a...\"}}\n{\"audit\":{\"action\":\"user.update\",\"actor\":{\"type\":\"user\",\"id\":\"usr_42\"},\"target\":{\"type\":\"user\",\"id\":\"usr_99\"},\"outcome\":\"success\",\"version\":1,\"idempotencyKey\":\"ak_5e7d8f9a0b1c2d3e\",\"prevHash\":\"3f2c8e1a...\",\"hash\":\"9a1b4d7c...\"}}\n","Output — .audit\u002F2026-04-24.ndjson","ndjson",[450,683,684,689],{"__ignoreMap":477},[481,685,686],{"class":483,"line":484},[481,687,688],{},"{\"audit\":{\"action\":\"invoice.refund\",\"actor\":{\"type\":\"user\",\"id\":\"usr_42\"},\"target\":{\"type\":\"invoice\",\"id\":\"inv_889\"},\"outcome\":\"success\",\"version\":1,\"idempotencyKey\":\"ak_8f3c4b2a1e5d6f7c\",\"prevHash\":null,\"hash\":\"3f2c8e1a...\"}}\n",[481,690,691],{"class":483,"line":521},[481,692,693],{},"{\"audit\":{\"action\":\"user.update\",\"actor\":{\"type\":\"user\",\"id\":\"usr_42\"},\"target\":{\"type\":\"user\",\"id\":\"usr_99\"},\"outcome\":\"success\",\"version\":1,\"idempotencyKey\":\"ak_5e7d8f9a0b1c2d3e\",\"prevHash\":\"3f2c8e1a...\",\"hash\":\"9a1b4d7c...\"}}\n",[446,695,696,697,700,701,704],{},"Each line's ",[450,698,699],{},"prevHash"," matches the previous line's ",[450,702,703],{},"hash",". Tampering with any row breaks the chain forward of that point — a verifier replays the hashes and reports the first mismatch.",[463,706,708],{"id":707},"audit-logs-to-a-dedicated-axiom-dataset","Audit logs to a dedicated Axiom dataset",[468,710,711,879,902],{},[471,712,714],{"className":473,"code":713,"filename":475,"language":476,"meta":477,"style":477},"import { auditOnly } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\n\nnitro.hooks.hook('evlog:drain', createAxiomDrain({ dataset: 'logs' }))\nnitro.hooks.hook('evlog:drain', auditOnly(\n  createAxiomDrain({ dataset: 'audit', apiKey: process.env.AXIOM_AUDIT_API_KEY }),\n))\n",[450,715,716,734,754,758,802,828,875],{"__ignoreMap":477},[481,717,718,720,722,724,726,728,730,732],{"class":483,"line":484},[481,719,488],{"class":487},[481,721,492],{"class":491},[481,723,496],{"class":495},[481,725,505],{"class":491},[481,727,508],{"class":487},[481,729,511],{"class":491},[481,731,515],{"class":514},[481,733,518],{"class":491},[481,735,736,738,740,743,745,747,749,752],{"class":483,"line":521},[481,737,488],{"class":487},[481,739,492],{"class":491},[481,741,742],{"class":495}," createAxiomDrain",[481,744,505],{"class":491},[481,746,508],{"class":487},[481,748,511],{"class":491},[481,750,751],{"class":514},"evlog\u002Faxiom",[481,753,518],{"class":491},[481,755,756],{"class":483,"line":542},[481,757,546],{"emptyLinePlaceholder":545},[481,759,760,762,764,766,768,770,772,774,776,778,780,782,784,786,789,791,793,796,798,800],{"class":483,"line":549},[481,761,552],{"class":495},[481,763,555],{"class":491},[481,765,558],{"class":495},[481,767,555],{"class":491},[481,769,564],{"class":563},[481,771,567],{"class":495},[481,773,570],{"class":491},[481,775,573],{"class":514},[481,777,570],{"class":491},[481,779,499],{"class":491},[481,781,742],{"class":563},[481,783,567],{"class":495},[481,785,598],{"class":491},[481,787,788],{"class":601}," dataset",[481,790,605],{"class":491},[481,792,511],{"class":491},[481,794,795],{"class":514},"logs",[481,797,570],{"class":491},[481,799,505],{"class":491},[481,801,675],{"class":495},[481,803,804,806,808,810,812,814,816,818,820,822,824,826],{"class":483,"line":585},[481,805,552],{"class":495},[481,807,555],{"class":491},[481,809,558],{"class":495},[481,811,555],{"class":491},[481,813,564],{"class":563},[481,815,567],{"class":495},[481,817,570],{"class":491},[481,819,573],{"class":514},[481,821,570],{"class":491},[481,823,499],{"class":491},[481,825,496],{"class":563},[481,827,582],{"class":495},[481,829,830,833,835,837,839,841,843,846,848,850,853,855,858,860,863,865,868,871,873],{"class":483,"line":654},[481,831,832],{"class":563},"  createAxiomDrain",[481,834,567],{"class":495},[481,836,598],{"class":491},[481,838,788],{"class":601},[481,840,605],{"class":491},[481,842,511],{"class":491},[481,844,845],{"class":514},"audit",[481,847,570],{"class":491},[481,849,499],{"class":491},[481,851,852],{"class":601}," apiKey",[481,854,605],{"class":491},[481,856,857],{"class":495}," process",[481,859,555],{"class":491},[481,861,862],{"class":495},"env",[481,864,555],{"class":491},[481,866,867],{"class":495},"AXIOM_AUDIT_API_KEY ",[481,869,870],{"class":491},"}",[481,872,628],{"class":495},[481,874,651],{"class":491},[481,876,877],{"class":483,"line":672},[481,878,675],{"class":495},[471,880,885],{"className":881,"code":882,"filename":883,"language":884,"meta":477,"style":477},"language-kusto shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","['audit']\n| where audit.action == \"invoice.refund\"\n| summarize count() by audit.outcome, bin(_time, 1h)\n","Output — Axiom query","kusto",[450,886,887,892,897],{"__ignoreMap":477},[481,888,889],{"class":483,"line":484},[481,890,891],{},"['audit']\n",[481,893,894],{"class":483,"line":521},[481,895,896],{},"| where audit.action == \"invoice.refund\"\n",[481,898,899],{"class":483,"line":542},[481,900,901],{},"| summarize count() by audit.outcome, bin(_time, 1h)\n",[471,903,906],{"className":881,"code":904,"filename":905,"language":884,"meta":477,"style":477},"['audit']\n| where audit.outcome == \"denied\"\n| summarize count() by audit.actor.id, audit.action\n| order by count_ desc\n","Output — denials by actor",[450,907,908,912,917,922],{"__ignoreMap":477},[481,909,910],{"class":483,"line":484},[481,911,891],{},[481,913,914],{"class":483,"line":521},[481,915,916],{},"| where audit.outcome == \"denied\"\n",[481,918,919],{"class":483,"line":542},[481,920,921],{},"| summarize count() by audit.actor.id, audit.action\n",[481,923,924],{"class":483,"line":549},[481,925,926],{},"| order by count_ desc\n",[446,928,929],{},"Splitting datasets means the audit dataset can have a longer retention (7y), tighter access controls, and a separate billing line — without touching the rest of your pipeline.",[463,931,933],{"id":932},"audit-logs-in-postgres","Audit logs in Postgres",[468,935,936,1192],{},[471,937,939],{"className":473,"code":938,"filename":475,"language":476,"meta":477,"style":477},"import { auditOnly } from 'evlog'\nimport type { DrainContext } from 'evlog'\n\nconst postgresAudit = async (ctx: DrainContext) => {\n  await db.insert(auditEvents).values({\n    id: ctx.event.audit!.idempotencyKey,\n    timestamp: new Date(ctx.event.timestamp),\n    payload: ctx.event,\n  }).onConflictDoNothing()\n}\n\nnitro.hooks.hook('evlog:drain', auditOnly(postgresAudit, { await: true }))\n",[450,940,941,959,981,985,1020,1050,1077,1107,1123,1139,1145,1150],{"__ignoreMap":477},[481,942,943,945,947,949,951,953,955,957],{"class":483,"line":484},[481,944,488],{"class":487},[481,946,492],{"class":491},[481,948,496],{"class":495},[481,950,505],{"class":491},[481,952,508],{"class":487},[481,954,511],{"class":491},[481,956,515],{"class":514},[481,958,518],{"class":491},[481,960,961,963,966,968,971,973,975,977,979],{"class":483,"line":521},[481,962,488],{"class":487},[481,964,965],{"class":487}," type",[481,967,492],{"class":491},[481,969,970],{"class":495}," DrainContext",[481,972,505],{"class":491},[481,974,508],{"class":487},[481,976,511],{"class":491},[481,978,515],{"class":514},[481,980,518],{"class":491},[481,982,983],{"class":483,"line":542},[481,984,546],{"emptyLinePlaceholder":545},[481,986,987,991,994,997,1000,1003,1007,1009,1012,1014,1017],{"class":483,"line":549},[481,988,990],{"class":989},"spNyl","const",[481,992,993],{"class":495}," postgresAudit ",[481,995,996],{"class":491},"=",[481,998,999],{"class":989}," async",[481,1001,1002],{"class":491}," (",[481,1004,1006],{"class":1005},"sHdIc","ctx",[481,1008,605],{"class":491},[481,1010,970],{"class":1011},"sBMFI",[481,1013,628],{"class":491},[481,1015,1016],{"class":989}," =>",[481,1018,1019],{"class":491}," {\n",[481,1021,1022,1025,1028,1030,1033,1035,1038,1040,1042,1045,1047],{"class":483,"line":585},[481,1023,1024],{"class":487},"  await",[481,1026,1027],{"class":495}," db",[481,1029,555],{"class":491},[481,1031,1032],{"class":563},"insert",[481,1034,567],{"class":601},[481,1036,1037],{"class":495},"auditEvents",[481,1039,628],{"class":601},[481,1041,555],{"class":491},[481,1043,1044],{"class":563},"values",[481,1046,567],{"class":601},[481,1048,1049],{"class":491},"{\n",[481,1051,1052,1055,1057,1060,1062,1065,1067,1069,1072,1075],{"class":483,"line":654},[481,1053,1054],{"class":601},"    id",[481,1056,605],{"class":491},[481,1058,1059],{"class":495}," ctx",[481,1061,555],{"class":491},[481,1063,1064],{"class":495},"event",[481,1066,555],{"class":491},[481,1068,845],{"class":495},[481,1070,1071],{"class":491},"!.",[481,1073,1074],{"class":495},"idempotencyKey",[481,1076,651],{"class":491},[481,1078,1079,1082,1084,1087,1090,1092,1094,1096,1098,1100,1103,1105],{"class":483,"line":672},[481,1080,1081],{"class":601},"    timestamp",[481,1083,605],{"class":491},[481,1085,1086],{"class":491}," new",[481,1088,1089],{"class":563}," Date",[481,1091,567],{"class":601},[481,1093,1006],{"class":495},[481,1095,555],{"class":491},[481,1097,1064],{"class":495},[481,1099,555],{"class":491},[481,1101,1102],{"class":495},"timestamp",[481,1104,628],{"class":601},[481,1106,651],{"class":491},[481,1108,1110,1113,1115,1117,1119,1121],{"class":483,"line":1109},8,[481,1111,1112],{"class":601},"    payload",[481,1114,605],{"class":491},[481,1116,1059],{"class":495},[481,1118,555],{"class":491},[481,1120,1064],{"class":495},[481,1122,651],{"class":491},[481,1124,1126,1129,1131,1133,1136],{"class":483,"line":1125},9,[481,1127,1128],{"class":491},"  }",[481,1130,628],{"class":601},[481,1132,555],{"class":491},[481,1134,1135],{"class":563},"onConflictDoNothing",[481,1137,1138],{"class":601},"()\n",[481,1140,1142],{"class":483,"line":1141},10,[481,1143,1144],{"class":491},"}\n",[481,1146,1148],{"class":483,"line":1147},11,[481,1149,546],{"emptyLinePlaceholder":545},[481,1151,1153,1155,1157,1159,1161,1163,1165,1167,1169,1171,1173,1175,1178,1180,1182,1184,1186,1188,1190],{"class":483,"line":1152},12,[481,1154,552],{"class":495},[481,1156,555],{"class":491},[481,1158,558],{"class":495},[481,1160,555],{"class":491},[481,1162,564],{"class":563},[481,1164,567],{"class":495},[481,1166,570],{"class":491},[481,1168,573],{"class":514},[481,1170,570],{"class":491},[481,1172,499],{"class":491},[481,1174,496],{"class":563},[481,1176,1177],{"class":495},"(postgresAudit",[481,1179,499],{"class":491},[481,1181,492],{"class":491},[481,1183,660],{"class":601},[481,1185,605],{"class":491},[481,1187,666],{"class":665},[481,1189,505],{"class":491},[481,1191,675],{"class":495},[471,1193,1198],{"className":1194,"code":1195,"filename":1196,"language":1197,"meta":477,"style":477},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","SELECT id, timestamp, payload->'audit'->>'action' AS action,\n       payload->'audit'->>'outcome' AS outcome\nFROM audit_events\nWHERE id = 'ak_8f3c4b2a1e5d6f7c';\n\n--          id          |       timestamp       |     action      | outcome\n-- ---------------------+-----------------------+-----------------+---------\n--  ak_8f3c4b2a1e5d6f7c | 2026-04-24 10:23:45.6 | invoice.refund  | success\n","Output — audit_events row","sql",[450,1199,1200,1205,1210,1215,1220,1224,1229,1234],{"__ignoreMap":477},[481,1201,1202],{"class":483,"line":484},[481,1203,1204],{},"SELECT id, timestamp, payload->'audit'->>'action' AS action,\n",[481,1206,1207],{"class":483,"line":521},[481,1208,1209],{},"       payload->'audit'->>'outcome' AS outcome\n",[481,1211,1212],{"class":483,"line":542},[481,1213,1214],{},"FROM audit_events\n",[481,1216,1217],{"class":483,"line":549},[481,1218,1219],{},"WHERE id = 'ak_8f3c4b2a1e5d6f7c';\n",[481,1221,1222],{"class":483,"line":585},[481,1223,546],{"emptyLinePlaceholder":545},[481,1225,1226],{"class":483,"line":654},[481,1227,1228],{},"--          id          |       timestamp       |     action      | outcome\n",[481,1230,1231],{"class":483,"line":672},[481,1232,1233],{},"-- ---------------------+-----------------------+-----------------+---------\n",[481,1235,1236],{"class":483,"line":1109},[481,1237,1238],{},"--  ak_8f3c4b2a1e5d6f7c | 2026-04-24 10:23:45.6 | invoice.refund  | success\n",[446,1240,1241,1242,1244,1245,1248],{},"The deterministic ",[450,1243,1074],{}," makes retries safe — duplicate inserts collapse via ",[450,1246,1247],{},"ON CONFLICT DO NOTHING",". Without it, a transient network blip during a retry would create a duplicate audit row, which is exactly what you don't want.",[463,1250,1252],{"id":1251},"testing-audits","Testing audits",[446,1254,1255,1258],{},[450,1256,1257],{},"mockAudit()"," captures every audit event emitted during a test:",[471,1260,1262],{"className":473,"code":1261,"language":476,"meta":477,"style":477},"import { mockAudit } from 'evlog'\n\nit('refunds the invoice and records an audit', async () => {\n  const captured = mockAudit()\n\n  await refundInvoice({ id: 'inv_889' }, { actor: { type: 'user', id: 'u1' } })\n\n  expect(captured.events).toHaveLength(1)\n  expect(captured.toIncludeAuditOf({\n    action: 'invoice.refund',\n    target: { type: 'invoice', id: 'inv_889' },\n    outcome: 'success',\n  })).toBe(true)\n\n  captured.restore()\n})\n",[450,1263,1264,1283,1287,1312,1327,1331,1397,1401,1430,1447,1463,1497,1513,1533,1538,1551],{"__ignoreMap":477},[481,1265,1266,1268,1270,1273,1275,1277,1279,1281],{"class":483,"line":484},[481,1267,488],{"class":487},[481,1269,492],{"class":491},[481,1271,1272],{"class":495}," mockAudit",[481,1274,505],{"class":491},[481,1276,508],{"class":487},[481,1278,511],{"class":491},[481,1280,515],{"class":514},[481,1282,518],{"class":491},[481,1284,1285],{"class":483,"line":521},[481,1286,546],{"emptyLinePlaceholder":545},[481,1288,1289,1292,1294,1296,1299,1301,1303,1305,1308,1310],{"class":483,"line":542},[481,1290,1291],{"class":563},"it",[481,1293,567],{"class":495},[481,1295,570],{"class":491},[481,1297,1298],{"class":514},"refunds the invoice and records an audit",[481,1300,570],{"class":491},[481,1302,499],{"class":491},[481,1304,999],{"class":989},[481,1306,1307],{"class":491}," ()",[481,1309,1016],{"class":989},[481,1311,1019],{"class":491},[481,1313,1314,1317,1320,1323,1325],{"class":483,"line":549},[481,1315,1316],{"class":989},"  const",[481,1318,1319],{"class":495}," captured",[481,1321,1322],{"class":491}," =",[481,1324,1272],{"class":563},[481,1326,1138],{"class":601},[481,1328,1329],{"class":483,"line":585},[481,1330,546],{"emptyLinePlaceholder":545},[481,1332,1333,1335,1338,1340,1342,1345,1347,1349,1352,1354,1357,1359,1362,1364,1366,1368,1370,1372,1375,1377,1379,1381,1383,1385,1388,1390,1392,1394],{"class":483,"line":654},[481,1334,1024],{"class":487},[481,1336,1337],{"class":563}," refundInvoice",[481,1339,567],{"class":601},[481,1341,598],{"class":491},[481,1343,1344],{"class":601}," id",[481,1346,605],{"class":491},[481,1348,511],{"class":491},[481,1350,1351],{"class":514},"inv_889",[481,1353,570],{"class":491},[481,1355,1356],{"class":491}," },",[481,1358,492],{"class":491},[481,1360,1361],{"class":601}," actor",[481,1363,605],{"class":491},[481,1365,492],{"class":491},[481,1367,965],{"class":601},[481,1369,605],{"class":491},[481,1371,511],{"class":491},[481,1373,1374],{"class":514},"user",[481,1376,570],{"class":491},[481,1378,499],{"class":491},[481,1380,1344],{"class":601},[481,1382,605],{"class":491},[481,1384,511],{"class":491},[481,1386,1387],{"class":514},"u1",[481,1389,570],{"class":491},[481,1391,505],{"class":491},[481,1393,505],{"class":491},[481,1395,1396],{"class":601},")\n",[481,1398,1399],{"class":483,"line":672},[481,1400,546],{"emptyLinePlaceholder":545},[481,1402,1403,1406,1408,1411,1413,1416,1418,1420,1423,1425,1428],{"class":483,"line":1109},[481,1404,1405],{"class":563},"  expect",[481,1407,567],{"class":601},[481,1409,1410],{"class":495},"captured",[481,1412,555],{"class":491},[481,1414,1415],{"class":495},"events",[481,1417,628],{"class":601},[481,1419,555],{"class":491},[481,1421,1422],{"class":563},"toHaveLength",[481,1424,567],{"class":601},[481,1426,1427],{"class":622},"1",[481,1429,1396],{"class":601},[481,1431,1432,1434,1436,1438,1440,1443,1445],{"class":483,"line":1125},[481,1433,1405],{"class":563},[481,1435,567],{"class":601},[481,1437,1410],{"class":495},[481,1439,555],{"class":491},[481,1441,1442],{"class":563},"toIncludeAuditOf",[481,1444,567],{"class":601},[481,1446,1049],{"class":491},[481,1448,1449,1452,1454,1456,1459,1461],{"class":483,"line":1141},[481,1450,1451],{"class":601},"    action",[481,1453,605],{"class":491},[481,1455,511],{"class":491},[481,1457,1458],{"class":514},"invoice.refund",[481,1460,570],{"class":491},[481,1462,651],{"class":491},[481,1464,1465,1468,1470,1472,1474,1476,1478,1481,1483,1485,1487,1489,1491,1493,1495],{"class":483,"line":1147},[481,1466,1467],{"class":601},"    target",[481,1469,605],{"class":491},[481,1471,492],{"class":491},[481,1473,965],{"class":601},[481,1475,605],{"class":491},[481,1477,511],{"class":491},[481,1479,1480],{"class":514},"invoice",[481,1482,570],{"class":491},[481,1484,499],{"class":491},[481,1486,1344],{"class":601},[481,1488,605],{"class":491},[481,1490,511],{"class":491},[481,1492,1351],{"class":514},[481,1494,570],{"class":491},[481,1496,669],{"class":491},[481,1498,1499,1502,1504,1506,1509,1511],{"class":483,"line":1152},[481,1500,1501],{"class":601},"    outcome",[481,1503,605],{"class":491},[481,1505,511],{"class":491},[481,1507,1508],{"class":514},"success",[481,1510,570],{"class":491},[481,1512,651],{"class":491},[481,1514,1516,1518,1521,1523,1526,1528,1531],{"class":483,"line":1515},13,[481,1517,1128],{"class":491},[481,1519,1520],{"class":601},"))",[481,1522,555],{"class":491},[481,1524,1525],{"class":563},"toBe",[481,1527,567],{"class":601},[481,1529,1530],{"class":665},"true",[481,1532,1396],{"class":601},[481,1534,1536],{"class":483,"line":1535},14,[481,1537,546],{"emptyLinePlaceholder":545},[481,1539,1541,1544,1546,1549],{"class":483,"line":1540},15,[481,1542,1543],{"class":495},"  captured",[481,1545,555],{"class":491},[481,1547,1548],{"class":563},"restore",[481,1550,1138],{"class":601},[481,1552,1554,1556],{"class":483,"line":1553},16,[481,1555,870],{"class":491},[481,1557,1396],{"class":495},[446,1559,1560,1561,1564,1565,1568],{},"Always call ",[450,1562,1563],{},"captured.restore()"," in an ",[450,1566,1567],{},"afterEach"," (or wrap with a fixture) so a failing assertion never leaks into the next test.",[463,1570,1572],{"id":1571},"api-reference","API Reference",[1574,1575,1576,1592],"table",{},[1577,1578,1579],"thead",{},[1580,1581,1582,1586,1589],"tr",{},[1583,1584,1585],"th",{},"Symbol",[1583,1587,1588],{},"Kind",[1583,1590,1591],{},"Notes",[1593,1594,1595,1609,1622,1634,1651,1663,1676,1689,1705,1717,1730,1745,1757],"tbody",{},[1580,1596,1597,1603,1606],{},[1598,1599,1600],"td",{},[450,1601,1602],{},"AuditFields",[1598,1604,1605],{},"type",[1598,1607,1608],{},"Reserved field on the wide event",[1580,1610,1611,1616,1619],{},[1598,1612,1613],{},[450,1614,1615],{},"defineAuditAction(name, opts?)",[1598,1617,1618],{},"factory",[1598,1620,1621],{},"Typed action registry, infers target shape",[1580,1623,1624,1629,1631],{},[1598,1625,1626],{},[450,1627,1628],{},"defineAuditCatalog(prefix, map)",[1598,1630,1618],{},[1598,1632,1633],{},"Bundle of typed audit actions sharing a prefix",[1580,1635,1636,1641,1644],{},[1598,1637,1638],{},[450,1639,1640],{},"log.audit(fields)",[1598,1642,1643],{},"method",[1598,1645,1646,1647,1650],{},"Sugar over ",[450,1648,1649],{},"log.set({ audit })"," + force-keep",[1580,1652,1653,1658,1660],{},[1598,1654,1655],{},[450,1656,1657],{},"log.audit.deny(reason, fields)",[1598,1659,1643],{},[1598,1661,1662],{},"Records a denied action",[1580,1664,1665,1670,1673],{},[1598,1666,1667],{},[450,1668,1669],{},"audit(fields)",[1598,1671,1672],{},"function",[1598,1674,1675],{},"Standalone for scripts \u002F jobs",[1580,1677,1678,1683,1686],{},[1598,1679,1680],{},[450,1681,1682],{},"withAudit({ action, target })(fn)",[1598,1684,1685],{},"wrapper",[1598,1687,1688],{},"Auto-emit success \u002F failure \u002F denied",[1580,1690,1691,1696,1699],{},[1598,1692,1693],{},[450,1694,1695],{},"auditDiff(before, after)",[1598,1697,1698],{},"helper",[1598,1700,1701,1702],{},"Redact-aware JSON Patch for ",[450,1703,1704],{},"changes",[1580,1706,1707,1711,1714],{},[1598,1708,1709],{},[450,1710,1257],{},[1598,1712,1713],{},"test util",[1598,1715,1716],{},"Capture + assert audits in tests",[1580,1718,1719,1724,1727],{},[1598,1720,1721],{},[450,1722,1723],{},"auditEnricher(opts?)",[1598,1725,1726],{},"enricher",[1598,1728,1729],{},"Auto-fill request \u002F runtime \u002F tenant context",[1580,1731,1732,1737,1739],{},[1598,1733,1734],{},[450,1735,1736],{},"auditOnly(drain, { await? })",[1598,1738,1685],{},[1598,1740,1741,1742,1744],{},"Routes only events with an ",[450,1743,845],{}," field",[1580,1746,1747,1752,1754],{},[1598,1748,1749],{},[450,1750,1751],{},"signed(drain, opts)",[1598,1753,1685],{},[1598,1755,1756],{},"Generic integrity wrapper (hmac \u002F hash-chain)",[1580,1758,1759,1764,1767],{},[1598,1760,1761],{},[450,1762,1763],{},"auditRedactPreset",[1598,1765,1766],{},"config",[1598,1768,1769],{},"Strict PII for audit events",[446,1771,1772,1773,1775],{},"Everything ships from the main ",[450,1774,515],{}," entrypoint.",[1777,1778,1779],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":477,"searchDepth":521,"depth":521,"links":1781},[1782,1783,1784,1785,1786],{"id":465,"depth":521,"text":466},{"id":707,"depth":521,"text":708},{"id":932,"depth":521,"text":933},{"id":1251,"depth":521,"text":1252},{"id":1571,"depth":521,"text":1572},"File system, Axiom, and Postgres recipes for audit logs, plus mockAudit for tests and the full API reference.","md",[1790,1793],{"label":341,"icon":318,"to":342,"color":1791,"variant":1792},"neutral","subtle",{"label":90,"icon":88,"to":95,"color":1791,"variant":1792},{},{"title":345,"icon":79},{"title":441,"description":1787},"8o79friF0r9Qjj-6gPWzBEvzdKI48KwyZdvkwvZP-_o",[1799,1801],{"title":341,"path":342,"stem":343,"description":1800,"icon":318,"children":-1},"Integrity, redact presets, GDPR vs append-only, retention windows, and the most common pitfalls when shipping audit logs to production.",{"title":349,"path":350,"stem":351,"description":1802,"icon":352,"children":-1},"Add derived context to every wide event automatically — user agent, geo, request size, and trace context. Built-in enrichers from evlog\u002Fenrichers, plus how to compose them with your own.",1779694503770]