[{"data":1,"prerenderedAt":1784},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-audit-recipes":439,"-use-cases-audit-recipes-surround":1779},[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":1768,"extension":1769,"links":1770,"meta":1775,"navigation":1776,"path":346,"seo":1777,"stem":347,"__hash__":1778},"docs\u002F4.use-cases\u002F4.audit\u002F06.recipes.md","Recipes & Reference",{"type":443,"value":444,"toc":1761},"minimark",[445,462,467,694,705,709,927,930,934,1239,1249,1253,1269,1521,1535,1546,1550,1751,1757],[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,1259,453,1262,1265,1266,605],{},[450,1256,1257],{},"mockAudit()"," captures every audit event on emit — from standalone ",[450,1260,1261],{},"audit()",[450,1263,1264],{},"log.audit()",", and ",[450,1267,1268],{},"log.set({ audit })",[471,1270,1272],{"className":473,"code":1271,"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  captured.assertAudit({\n    action: 'invoice.refund',\n    target: { type: 'invoice', id: 'inv_889' },\n    outcome: 'success',\n  })\n\n  captured.restore()\n})\n",[450,1273,1274,1293,1297,1322,1337,1341,1407,1411,1425,1441,1475,1491,1497,1502,1514],{"__ignoreMap":477},[481,1275,1276,1278,1280,1283,1285,1287,1289,1291],{"class":483,"line":484},[481,1277,488],{"class":487},[481,1279,492],{"class":491},[481,1281,1282],{"class":495}," mockAudit",[481,1284,505],{"class":491},[481,1286,508],{"class":487},[481,1288,511],{"class":491},[481,1290,515],{"class":514},[481,1292,518],{"class":491},[481,1294,1295],{"class":483,"line":521},[481,1296,546],{"emptyLinePlaceholder":545},[481,1298,1299,1302,1304,1306,1309,1311,1313,1315,1318,1320],{"class":483,"line":542},[481,1300,1301],{"class":563},"it",[481,1303,567],{"class":495},[481,1305,570],{"class":491},[481,1307,1308],{"class":514},"refunds the invoice and records an audit",[481,1310,570],{"class":491},[481,1312,499],{"class":491},[481,1314,999],{"class":989},[481,1316,1317],{"class":491}," ()",[481,1319,1016],{"class":989},[481,1321,1019],{"class":491},[481,1323,1324,1327,1330,1333,1335],{"class":483,"line":549},[481,1325,1326],{"class":989},"  const",[481,1328,1329],{"class":495}," captured",[481,1331,1332],{"class":491}," =",[481,1334,1282],{"class":563},[481,1336,1138],{"class":601},[481,1338,1339],{"class":483,"line":585},[481,1340,546],{"emptyLinePlaceholder":545},[481,1342,1343,1345,1348,1350,1352,1355,1357,1359,1362,1364,1367,1369,1372,1374,1376,1378,1380,1382,1385,1387,1389,1391,1393,1395,1398,1400,1402,1404],{"class":483,"line":654},[481,1344,1024],{"class":487},[481,1346,1347],{"class":563}," refundInvoice",[481,1349,567],{"class":601},[481,1351,598],{"class":491},[481,1353,1354],{"class":601}," id",[481,1356,605],{"class":491},[481,1358,511],{"class":491},[481,1360,1361],{"class":514},"inv_889",[481,1363,570],{"class":491},[481,1365,1366],{"class":491}," },",[481,1368,492],{"class":491},[481,1370,1371],{"class":601}," actor",[481,1373,605],{"class":491},[481,1375,492],{"class":491},[481,1377,965],{"class":601},[481,1379,605],{"class":491},[481,1381,511],{"class":491},[481,1383,1384],{"class":514},"user",[481,1386,570],{"class":491},[481,1388,499],{"class":491},[481,1390,1354],{"class":601},[481,1392,605],{"class":491},[481,1394,511],{"class":491},[481,1396,1397],{"class":514},"u1",[481,1399,570],{"class":491},[481,1401,505],{"class":491},[481,1403,505],{"class":491},[481,1405,1406],{"class":601},")\n",[481,1408,1409],{"class":483,"line":672},[481,1410,546],{"emptyLinePlaceholder":545},[481,1412,1413,1416,1418,1421,1423],{"class":483,"line":1109},[481,1414,1415],{"class":495},"  captured",[481,1417,555],{"class":491},[481,1419,1420],{"class":563},"assertAudit",[481,1422,567],{"class":601},[481,1424,1049],{"class":491},[481,1426,1427,1430,1432,1434,1437,1439],{"class":483,"line":1125},[481,1428,1429],{"class":601},"    action",[481,1431,605],{"class":491},[481,1433,511],{"class":491},[481,1435,1436],{"class":514},"invoice.refund",[481,1438,570],{"class":491},[481,1440,651],{"class":491},[481,1442,1443,1446,1448,1450,1452,1454,1456,1459,1461,1463,1465,1467,1469,1471,1473],{"class":483,"line":1141},[481,1444,1445],{"class":601},"    target",[481,1447,605],{"class":491},[481,1449,492],{"class":491},[481,1451,965],{"class":601},[481,1453,605],{"class":491},[481,1455,511],{"class":491},[481,1457,1458],{"class":514},"invoice",[481,1460,570],{"class":491},[481,1462,499],{"class":491},[481,1464,1354],{"class":601},[481,1466,605],{"class":491},[481,1468,511],{"class":491},[481,1470,1361],{"class":514},[481,1472,570],{"class":491},[481,1474,669],{"class":491},[481,1476,1477,1480,1482,1484,1487,1489],{"class":483,"line":1147},[481,1478,1479],{"class":601},"    outcome",[481,1481,605],{"class":491},[481,1483,511],{"class":491},[481,1485,1486],{"class":514},"success",[481,1488,570],{"class":491},[481,1490,651],{"class":491},[481,1492,1493,1495],{"class":483,"line":1152},[481,1494,1128],{"class":491},[481,1496,1406],{"class":601},[481,1498,1500],{"class":483,"line":1499},13,[481,1501,546],{"emptyLinePlaceholder":545},[481,1503,1505,1507,1509,1512],{"class":483,"line":1504},14,[481,1506,1415],{"class":495},[481,1508,555],{"class":491},[481,1510,1511],{"class":563},"restore",[481,1513,1138],{"class":601},[481,1515,1517,1519],{"class":483,"line":1516},15,[481,1518,870],{"class":491},[481,1520,1406],{"class":495},[446,1522,1523,1524,1527,1528,1531,1532,555],{},"Prefer ",[450,1525,1526],{},"assertAudit()"," when a missing audit should fail the test with a readable message. Use ",[450,1529,1530],{},"toIncludeAuditOf()"," when you need a boolean inside ",[450,1533,1534],{},"expect(...)",[446,1536,1537,1538,1541,1542,1545],{},"Always call ",[450,1539,1540],{},"captured.restore()"," in an ",[450,1543,1544],{},"afterEach"," (or wrap with a fixture) so a failing assertion never leaks into the next test.",[463,1547,1549],{"id":1548},"api-reference","API Reference",[1551,1552,1553,1569],"table",{},[1554,1555,1556],"thead",{},[1557,1558,1559,1563,1566],"tr",{},[1560,1561,1562],"th",{},"Symbol",[1560,1564,1565],{},"Kind",[1560,1567,1568],{},"Notes",[1570,1571,1572,1586,1599,1611,1627,1639,1652,1665,1681,1698,1711,1726,1738],"tbody",{},[1557,1573,1574,1580,1583],{},[1575,1576,1577],"td",{},[450,1578,1579],{},"AuditFields",[1575,1581,1582],{},"type",[1575,1584,1585],{},"Reserved field on the wide event",[1557,1587,1588,1593,1596],{},[1575,1589,1590],{},[450,1591,1592],{},"defineAuditAction(name, opts?)",[1575,1594,1595],{},"factory",[1575,1597,1598],{},"Typed action registry, infers target shape",[1557,1600,1601,1606,1608],{},[1575,1602,1603],{},[450,1604,1605],{},"defineAuditCatalog(prefix, map)",[1575,1607,1595],{},[1575,1609,1610],{},"Bundle of typed audit actions sharing a prefix",[1557,1612,1613,1618,1621],{},[1575,1614,1615],{},[450,1616,1617],{},"log.audit(fields)",[1575,1619,1620],{},"method",[1575,1622,1623,1624,1626],{},"Sugar over ",[450,1625,1268],{}," + force-keep",[1557,1628,1629,1634,1636],{},[1575,1630,1631],{},[450,1632,1633],{},"log.audit.deny(reason, fields)",[1575,1635,1620],{},[1575,1637,1638],{},"Records a denied action",[1557,1640,1641,1646,1649],{},[1575,1642,1643],{},[450,1644,1645],{},"audit(fields)",[1575,1647,1648],{},"function",[1575,1650,1651],{},"Standalone for scripts \u002F jobs",[1557,1653,1654,1659,1662],{},[1575,1655,1656],{},[450,1657,1658],{},"withAudit({ action, target })(fn)",[1575,1660,1661],{},"wrapper",[1575,1663,1664],{},"Auto-emit success \u002F failure \u002F denied",[1557,1666,1667,1672,1675],{},[1575,1668,1669],{},[450,1670,1671],{},"auditDiff(before, after)",[1575,1673,1674],{},"helper",[1575,1676,1677,1678],{},"Redact-aware JSON Patch for ",[450,1679,1680],{},"changes",[1557,1682,1683,1687,1690],{},[1575,1684,1685],{},[450,1686,1257],{},[1575,1688,1689],{},"test util",[1575,1691,1692,1693,1695,1696],{},"Capture audits on emit; ",[450,1694,1526],{}," or ",[450,1697,1530],{},[1557,1699,1700,1705,1708],{},[1575,1701,1702],{},[450,1703,1704],{},"auditEnricher(opts?)",[1575,1706,1707],{},"enricher",[1575,1709,1710],{},"Auto-fill request \u002F runtime \u002F tenant context",[1557,1712,1713,1718,1720],{},[1575,1714,1715],{},[450,1716,1717],{},"auditOnly(drain, { await? })",[1575,1719,1661],{},[1575,1721,1722,1723,1725],{},"Routes only events with an ",[450,1724,845],{}," field",[1557,1727,1728,1733,1735],{},[1575,1729,1730],{},[450,1731,1732],{},"signed(drain, opts)",[1575,1734,1661],{},[1575,1736,1737],{},"Generic integrity wrapper (hmac \u002F hash-chain)",[1557,1739,1740,1745,1748],{},[1575,1741,1742],{},[450,1743,1744],{},"auditRedactPreset",[1575,1746,1747],{},"config",[1575,1749,1750],{},"Strict PII for audit events",[446,1752,1753,1754,1756],{},"Everything ships from the main ",[450,1755,515],{}," entrypoint.",[1758,1759,1760],"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":1762},[1763,1764,1765,1766,1767],{"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":1548,"depth":521,"text":1549},"File system, Axiom, and Postgres recipes for audit logs, plus mockAudit for tests and the full API reference.","md",[1771,1774],{"label":341,"icon":318,"to":342,"color":1772,"variant":1773},"neutral","subtle",{"label":90,"icon":88,"to":95,"color":1772,"variant":1773},{},{"title":345,"icon":79},{"title":441,"description":1768},"qV1a6_SV8lJv5TO7Ia7C6RIsbpWdiLQjAa4s_SafRwE",[1780,1782],{"title":341,"path":342,"stem":343,"description":1781,"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":1783,"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.",1780078696959]