[{"data":1,"prerenderedAt":2435},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-audit-recipes":567,"-use-cases-audit-recipes-surround":2430},[4,30,80,133,313,444,503,542],{"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},"CLI","\u002Fcli","3.cli",[85,88,93,98,103,108,113,118,123,128],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":94,"path":95,"stem":96,"icon":97},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":99,"path":100,"stem":101,"icon":102},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":104,"path":105,"stem":106,"icon":107},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":109,"path":110,"stem":111,"icon":112},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":114,"path":115,"stem":116,"icon":117},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":119,"path":120,"stem":121,"icon":122},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":124,"path":125,"stem":126,"icon":127},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":129,"path":130,"stem":131,"icon":132},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":134,"path":135,"stem":136,"children":137,"page":29},"Integrate","\u002Fintegrate","4.integrate",[138,142,225],{"title":36,"path":139,"stem":140,"icon":141},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":143,"path":144,"stem":145,"children":146,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[147,150,180,205],{"title":36,"path":148,"stem":149,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":151,"path":152,"stem":153,"children":154,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[155,160,165,170,175],{"title":156,"path":157,"stem":158,"icon":159},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":161,"path":162,"stem":163,"icon":164},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":166,"path":167,"stem":168,"icon":169},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":171,"path":172,"stem":173,"icon":174},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":176,"path":177,"stem":178,"icon":179},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":181,"path":182,"stem":183,"children":184,"page":29},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[185,190,195,200],{"title":186,"path":187,"stem":188,"icon":189},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":191,"path":192,"stem":193,"icon":194},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":196,"path":197,"stem":198,"icon":199},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":201,"path":202,"stem":203,"icon":204},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":206,"path":207,"stem":208,"children":209,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[210,215,220],{"title":211,"path":212,"stem":213,"icon":214},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":216,"path":217,"stem":218,"icon":219},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":221,"path":222,"stem":223,"icon":224},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":226,"path":227,"stem":228,"children":229,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[230,234,239,244,249,254,259,264,269,274,279,284,289,294,298,303,308],{"title":36,"path":231,"stem":232,"icon":233},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":235,"path":236,"stem":237,"icon":238},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":240,"path":241,"stem":242,"icon":243},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":245,"path":246,"stem":247,"icon":248},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":250,"path":251,"stem":252,"icon":253},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":255,"path":256,"stem":257,"icon":258},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":260,"path":261,"stem":262,"icon":263},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":265,"path":266,"stem":267,"icon":268},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":270,"path":271,"stem":272,"icon":273},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":275,"path":276,"stem":277,"icon":278},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":280,"path":281,"stem":282,"icon":283},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":285,"path":286,"stem":287,"icon":288},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":290,"path":291,"stem":292,"icon":293},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":295,"path":296,"stem":297,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":299,"path":300,"stem":301,"icon":302},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":304,"path":305,"stem":306,"icon":307},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":309,"path":310,"stem":311,"icon":312},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":314,"path":315,"stem":316,"children":317,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[318,321,326,354,381,413,434,439],{"title":36,"path":319,"stem":320,"icon":102},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":322,"path":323,"stem":324,"icon":325},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":327,"icon":328,"path":329,"stem":330,"children":331,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[332,335,340,345,350],{"title":36,"path":333,"stem":334,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":336,"path":337,"stem":338,"icon":339},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":341,"path":342,"stem":343,"icon":344},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":346,"path":347,"stem":348,"icon":349},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":351,"path":352,"stem":353,"icon":132},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":355,"icon":356,"path":357,"stem":358,"children":359,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[360,363,368,373,377],{"title":36,"path":361,"stem":362,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":364,"path":365,"stem":366,"icon":367},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":369,"path":370,"stem":371,"icon":372},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":374,"path":375,"stem":376,"icon":325},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":378,"path":379,"stem":380,"icon":107},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":382,"icon":383,"path":384,"stem":385,"children":386,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[387,390,395,400,405,409],{"title":36,"path":388,"stem":389,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":391,"path":392,"stem":393,"icon":394},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":396,"path":397,"stem":398,"icon":399},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":401,"path":402,"stem":403,"icon":404},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":406,"path":407,"stem":408,"icon":383},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":410,"path":411,"stem":412,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":351,"icon":107,"path":414,"stem":415,"children":416,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[417,420,425,430],{"title":36,"path":418,"stem":419,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":421,"path":422,"stem":423,"icon":424},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":426,"path":427,"stem":428,"icon":429},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":431,"path":432,"stem":433,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":435,"path":436,"stem":437,"icon":438},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":440,"path":441,"stem":442,"icon":443},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":445,"path":446,"stem":447,"children":448,"page":29},"Extend","\u002Fextend","6.extend",[449,453,458,463,467,472,476,480,484,488,493,498],{"title":36,"path":450,"stem":451,"icon":452},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":454,"path":455,"stem":456,"icon":457},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":459,"path":460,"stem":461,"icon":462},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":464,"path":465,"stem":466,"icon":457},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":468,"path":469,"stem":470,"icon":471},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":410,"path":473,"stem":474,"icon":475},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":477,"path":478,"stem":479,"icon":452},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":481,"path":482,"stem":483,"icon":438},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":485,"path":486,"stem":487,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":489,"path":490,"stem":491,"icon":492},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":494,"path":495,"stem":496,"icon":497},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":499,"path":500,"stem":501,"icon":502},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":431,"path":504,"stem":505,"children":506,"page":29},"\u002Freference","7.reference",[507,511,516,519,524,528,533,537],{"title":36,"path":508,"stem":509,"icon":510},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":512,"path":513,"stem":514,"icon":515},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":378,"path":517,"stem":518,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":520,"path":521,"stem":522,"icon":523},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":525,"path":526,"stem":527,"icon":383},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":529,"path":530,"stem":531,"icon":532},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":534,"path":535,"stem":536,"icon":438},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":538,"path":539,"stem":540,"icon":541},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"title":543,"path":544,"stem":545,"children":546,"page":29},"Compare","\u002Fcompare","8.compare",[547,551,555,559,563],{"title":548,"path":549,"stem":550,"icon":532},"evlog vs Pino","\u002Fcompare\u002Fpino","8.compare\u002F1.pino",{"title":552,"path":553,"stem":554,"icon":199},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","8.compare\u002F2.opentelemetry",{"title":556,"path":557,"stem":558,"icon":532},"evlog vs LogTape","\u002Fcompare\u002Flogtape","8.compare\u002F3.logtape",{"title":560,"path":561,"stem":562,"icon":532},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","8.compare\u002F4.winston",{"title":564,"path":565,"stem":566,"icon":532},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","8.compare\u002F5.consola",{"id":568,"title":569,"body":570,"description":2419,"extension":2420,"links":2421,"meta":2426,"navigation":2427,"path":411,"seo":2428,"stem":412,"__hash__":2429},"docs\u002F5.use-cases\u002F4.audit\u002F06.recipes.md","Recipes & Reference",{"type":571,"value":572,"toc":2412},"minimark",[573,590,595,1203,1212,1216,1515,1518,1522,1897,1907,1911,1927,2173,2187,2198,2202,2402,2408],[574,575,576,577,581,582,585,586,589],"p",{},"Pick the recipe that matches your drain, drop it in, and you have a tamper-evident audit log. Each recipe composes the same primitives (",[578,579,580],"code",{},"auditOnly",", ",[578,583,584],{},"signed",", optional ",[578,587,588],{},"await: true",") over different drains.",[591,592,594],"h2",{"id":593},"audit-logs-on-disk","Audit logs on disk",[596,597,598,804],"code-group",{},[599,600,606],"pre",{"className":601,"code":602,"filename":603,"language":604,"meta":605,"style":605},"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","",[578,607,608,647,668,675,711,780,798],{"__ignoreMap":605},[609,610,613,617,621,625,628,631,634,637,640,644],"span",{"class":611,"line":612},"line",1,[609,614,616],{"class":615},"s7zQu","import",[609,618,620],{"class":619},"sMK4o"," {",[609,622,624],{"class":623},"sTEyZ"," auditOnly",[609,626,627],{"class":619},",",[609,629,630],{"class":623}," signed",[609,632,633],{"class":619}," }",[609,635,636],{"class":615}," from",[609,638,639],{"class":619}," '",[609,641,643],{"class":642},"sfazB","evlog",[609,645,646],{"class":619},"'\n",[609,648,650,652,654,657,659,661,663,666],{"class":611,"line":649},2,[609,651,616],{"class":615},[609,653,620],{"class":619},[609,655,656],{"class":623}," createFsDrain",[609,658,633],{"class":619},[609,660,636],{"class":615},[609,662,639],{"class":619},[609,664,665],{"class":642},"evlog\u002Ffs",[609,667,646],{"class":619},[609,669,671],{"class":611,"line":670},3,[609,672,674],{"emptyLinePlaceholder":673},true,"\n",[609,676,678,681,684,687,689,693,696,699,702,704,706,708],{"class":611,"line":677},4,[609,679,680],{"class":623},"nitro",[609,682,683],{"class":619},".",[609,685,686],{"class":623},"hooks",[609,688,683],{"class":619},[609,690,692],{"class":691},"s2Zo4","hook",[609,694,695],{"class":623},"(",[609,697,698],{"class":619},"'",[609,700,701],{"class":642},"evlog:drain",[609,703,698],{"class":619},[609,705,627],{"class":619},[609,707,624],{"class":691},[609,709,710],{"class":623},"(\n",[609,712,714,717,719,722,724,727,731,734,736,739,741,743,746,748,752,754,757,759,761,764,766,768,771,773,775,777],{"class":611,"line":713},5,[609,715,716],{"class":691},"  signed",[609,718,695],{"class":623},[609,720,721],{"class":691},"createFsDrain",[609,723,695],{"class":623},[609,725,726],{"class":619},"{",[609,728,730],{"class":729},"swJcz"," dir",[609,732,733],{"class":619},":",[609,735,639],{"class":619},[609,737,738],{"class":642},".audit",[609,740,698],{"class":619},[609,742,627],{"class":619},[609,744,745],{"class":729}," maxFiles",[609,747,733],{"class":619},[609,749,751],{"class":750},"sbssI"," 30",[609,753,633],{"class":619},[609,755,756],{"class":623},")",[609,758,627],{"class":619},[609,760,620],{"class":619},[609,762,763],{"class":729}," strategy",[609,765,733],{"class":619},[609,767,639],{"class":619},[609,769,770],{"class":642},"hash-chain",[609,772,698],{"class":619},[609,774,633],{"class":619},[609,776,756],{"class":623},[609,778,779],{"class":619},",\n",[609,781,783,786,789,791,795],{"class":611,"line":782},6,[609,784,785],{"class":619},"  {",[609,787,788],{"class":729}," await",[609,790,733],{"class":619},[609,792,794],{"class":793},"sfNiH"," true",[609,796,797],{"class":619}," },\n",[609,799,801],{"class":611,"line":800},7,[609,802,803],{"class":623},"))\n",[599,805,810],{"className":806,"code":807,"filename":808,"language":809,"meta":605,"style":605},"language-jsonl 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","jsonl",[578,811,812,1015],{"__ignoreMap":605},[609,813,814,816,819,823,825,828,830,834,836,838,840,843,845,847,849,852,854,856,858,861,863,865,867,870,872,874,876,879,881,883,885,888,890,893,895,898,900,902,904,906,908,910,912,915,917,919,921,923,925,927,929,932,934,936,938,941,943,945,947,950,952,954,956,959,961,963,966,968,970,973,975,977,979,982,984,986,988,991,993,996,998,1001,1003,1005,1007,1010,1012],{"class":611,"line":612},[609,815,726],{"class":619},[609,817,818],{"class":619},"\"",[609,820,822],{"class":821},"spNyl","audit",[609,824,818],{"class":619},[609,826,827],{"class":619},":{",[609,829,818],{"class":619},[609,831,833],{"class":832},"sBMFI","action",[609,835,818],{"class":619},[609,837,733],{"class":619},[609,839,818],{"class":619},[609,841,842],{"class":642},"invoice.refund",[609,844,818],{"class":619},[609,846,627],{"class":619},[609,848,818],{"class":619},[609,850,851],{"class":832},"actor",[609,853,818],{"class":619},[609,855,827],{"class":619},[609,857,818],{"class":619},[609,859,860],{"class":750},"type",[609,862,818],{"class":619},[609,864,733],{"class":619},[609,866,818],{"class":619},[609,868,869],{"class":642},"user",[609,871,818],{"class":619},[609,873,627],{"class":619},[609,875,818],{"class":619},[609,877,878],{"class":750},"id",[609,880,818],{"class":619},[609,882,733],{"class":619},[609,884,818],{"class":619},[609,886,887],{"class":642},"usr_42",[609,889,818],{"class":619},[609,891,892],{"class":619},"},",[609,894,818],{"class":619},[609,896,897],{"class":832},"target",[609,899,818],{"class":619},[609,901,827],{"class":619},[609,903,818],{"class":619},[609,905,860],{"class":750},[609,907,818],{"class":619},[609,909,733],{"class":619},[609,911,818],{"class":619},[609,913,914],{"class":642},"invoice",[609,916,818],{"class":619},[609,918,627],{"class":619},[609,920,818],{"class":619},[609,922,878],{"class":750},[609,924,818],{"class":619},[609,926,733],{"class":619},[609,928,818],{"class":619},[609,930,931],{"class":642},"inv_889",[609,933,818],{"class":619},[609,935,892],{"class":619},[609,937,818],{"class":619},[609,939,940],{"class":832},"outcome",[609,942,818],{"class":619},[609,944,733],{"class":619},[609,946,818],{"class":619},[609,948,949],{"class":642},"success",[609,951,818],{"class":619},[609,953,627],{"class":619},[609,955,818],{"class":619},[609,957,958],{"class":832},"version",[609,960,818],{"class":619},[609,962,733],{"class":619},[609,964,965],{"class":750},"1",[609,967,627],{"class":619},[609,969,818],{"class":619},[609,971,972],{"class":832},"idempotencyKey",[609,974,818],{"class":619},[609,976,733],{"class":619},[609,978,818],{"class":619},[609,980,981],{"class":642},"ak_8f3c4b2a1e5d6f7c",[609,983,818],{"class":619},[609,985,627],{"class":619},[609,987,818],{"class":619},[609,989,990],{"class":832},"prevHash",[609,992,818],{"class":619},[609,994,995],{"class":619},":null,",[609,997,818],{"class":619},[609,999,1000],{"class":832},"hash",[609,1002,818],{"class":619},[609,1004,733],{"class":619},[609,1006,818],{"class":619},[609,1008,1009],{"class":642},"3f2c8e1a...",[609,1011,818],{"class":619},[609,1013,1014],{"class":619},"}}\n",[609,1016,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035,1037,1040,1042,1044,1046,1048,1050,1052,1054,1056,1058,1060,1062,1064,1066,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088,1090,1092,1094,1096,1098,1100,1102,1104,1106,1108,1110,1112,1114,1116,1118,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153,1155,1157,1159,1161,1163,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1199,1201],{"class":611,"line":649},[609,1018,726],{"class":619},[609,1020,818],{"class":619},[609,1022,822],{"class":821},[609,1024,818],{"class":619},[609,1026,827],{"class":619},[609,1028,818],{"class":619},[609,1030,833],{"class":832},[609,1032,818],{"class":619},[609,1034,733],{"class":619},[609,1036,818],{"class":619},[609,1038,1039],{"class":642},"user.update",[609,1041,818],{"class":619},[609,1043,627],{"class":619},[609,1045,818],{"class":619},[609,1047,851],{"class":832},[609,1049,818],{"class":619},[609,1051,827],{"class":619},[609,1053,818],{"class":619},[609,1055,860],{"class":750},[609,1057,818],{"class":619},[609,1059,733],{"class":619},[609,1061,818],{"class":619},[609,1063,869],{"class":642},[609,1065,818],{"class":619},[609,1067,627],{"class":619},[609,1069,818],{"class":619},[609,1071,878],{"class":750},[609,1073,818],{"class":619},[609,1075,733],{"class":619},[609,1077,818],{"class":619},[609,1079,887],{"class":642},[609,1081,818],{"class":619},[609,1083,892],{"class":619},[609,1085,818],{"class":619},[609,1087,897],{"class":832},[609,1089,818],{"class":619},[609,1091,827],{"class":619},[609,1093,818],{"class":619},[609,1095,860],{"class":750},[609,1097,818],{"class":619},[609,1099,733],{"class":619},[609,1101,818],{"class":619},[609,1103,869],{"class":642},[609,1105,818],{"class":619},[609,1107,627],{"class":619},[609,1109,818],{"class":619},[609,1111,878],{"class":750},[609,1113,818],{"class":619},[609,1115,733],{"class":619},[609,1117,818],{"class":619},[609,1119,1120],{"class":642},"usr_99",[609,1122,818],{"class":619},[609,1124,892],{"class":619},[609,1126,818],{"class":619},[609,1128,940],{"class":832},[609,1130,818],{"class":619},[609,1132,733],{"class":619},[609,1134,818],{"class":619},[609,1136,949],{"class":642},[609,1138,818],{"class":619},[609,1140,627],{"class":619},[609,1142,818],{"class":619},[609,1144,958],{"class":832},[609,1146,818],{"class":619},[609,1148,733],{"class":619},[609,1150,965],{"class":750},[609,1152,627],{"class":619},[609,1154,818],{"class":619},[609,1156,972],{"class":832},[609,1158,818],{"class":619},[609,1160,733],{"class":619},[609,1162,818],{"class":619},[609,1164,1165],{"class":642},"ak_5e7d8f9a0b1c2d3e",[609,1167,818],{"class":619},[609,1169,627],{"class":619},[609,1171,818],{"class":619},[609,1173,990],{"class":832},[609,1175,818],{"class":619},[609,1177,733],{"class":619},[609,1179,818],{"class":619},[609,1181,1009],{"class":642},[609,1183,818],{"class":619},[609,1185,627],{"class":619},[609,1187,818],{"class":619},[609,1189,1000],{"class":832},[609,1191,818],{"class":619},[609,1193,733],{"class":619},[609,1195,818],{"class":619},[609,1197,1198],{"class":642},"9a1b4d7c...",[609,1200,818],{"class":619},[609,1202,1014],{"class":619},[574,1204,1205,1206,1208,1209,1211],{},"Each line's ",[578,1207,990],{}," matches the previous line's ",[578,1210,1000],{},". Tampering with any row breaks the chain forward of that point, and a verifier replays the hashes and reports the first mismatch.",[591,1213,1215],{"id":1214},"audit-logs-to-a-dedicated-axiom-dataset","Audit logs to a dedicated Axiom dataset",[596,1217,1218,1385,1453],{},[599,1219,1221],{"className":601,"code":1220,"filename":603,"language":604,"meta":605,"style":605},"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",[578,1222,1223,1241,1261,1265,1309,1335,1381],{"__ignoreMap":605},[609,1224,1225,1227,1229,1231,1233,1235,1237,1239],{"class":611,"line":612},[609,1226,616],{"class":615},[609,1228,620],{"class":619},[609,1230,624],{"class":623},[609,1232,633],{"class":619},[609,1234,636],{"class":615},[609,1236,639],{"class":619},[609,1238,643],{"class":642},[609,1240,646],{"class":619},[609,1242,1243,1245,1247,1250,1252,1254,1256,1259],{"class":611,"line":649},[609,1244,616],{"class":615},[609,1246,620],{"class":619},[609,1248,1249],{"class":623}," createAxiomDrain",[609,1251,633],{"class":619},[609,1253,636],{"class":615},[609,1255,639],{"class":619},[609,1257,1258],{"class":642},"evlog\u002Faxiom",[609,1260,646],{"class":619},[609,1262,1263],{"class":611,"line":670},[609,1264,674],{"emptyLinePlaceholder":673},[609,1266,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1296,1298,1300,1303,1305,1307],{"class":611,"line":677},[609,1268,680],{"class":623},[609,1270,683],{"class":619},[609,1272,686],{"class":623},[609,1274,683],{"class":619},[609,1276,692],{"class":691},[609,1278,695],{"class":623},[609,1280,698],{"class":619},[609,1282,701],{"class":642},[609,1284,698],{"class":619},[609,1286,627],{"class":619},[609,1288,1249],{"class":691},[609,1290,695],{"class":623},[609,1292,726],{"class":619},[609,1294,1295],{"class":729}," dataset",[609,1297,733],{"class":619},[609,1299,639],{"class":619},[609,1301,1302],{"class":642},"logs",[609,1304,698],{"class":619},[609,1306,633],{"class":619},[609,1308,803],{"class":623},[609,1310,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329,1331,1333],{"class":611,"line":713},[609,1312,680],{"class":623},[609,1314,683],{"class":619},[609,1316,686],{"class":623},[609,1318,683],{"class":619},[609,1320,692],{"class":691},[609,1322,695],{"class":623},[609,1324,698],{"class":619},[609,1326,701],{"class":642},[609,1328,698],{"class":619},[609,1330,627],{"class":619},[609,1332,624],{"class":691},[609,1334,710],{"class":623},[609,1336,1337,1340,1342,1344,1346,1348,1350,1352,1354,1356,1359,1361,1364,1366,1369,1371,1374,1377,1379],{"class":611,"line":782},[609,1338,1339],{"class":691},"  createAxiomDrain",[609,1341,695],{"class":623},[609,1343,726],{"class":619},[609,1345,1295],{"class":729},[609,1347,733],{"class":619},[609,1349,639],{"class":619},[609,1351,822],{"class":642},[609,1353,698],{"class":619},[609,1355,627],{"class":619},[609,1357,1358],{"class":729}," apiKey",[609,1360,733],{"class":619},[609,1362,1363],{"class":623}," process",[609,1365,683],{"class":619},[609,1367,1368],{"class":623},"env",[609,1370,683],{"class":619},[609,1372,1373],{"class":623},"AXIOM_AUDIT_API_KEY ",[609,1375,1376],{"class":619},"}",[609,1378,756],{"class":623},[609,1380,779],{"class":619},[609,1382,1383],{"class":611,"line":800},[609,1384,803],{"class":623},[599,1386,1391],{"className":1387,"code":1388,"filename":1389,"language":1390,"meta":605,"style":605},"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",[578,1392,1393,1407,1425],{"__ignoreMap":605},[609,1394,1395,1398,1400,1402,1404],{"class":611,"line":612},[609,1396,1397],{"class":623},"[",[609,1399,698],{"class":619},[609,1401,822],{"class":642},[609,1403,698],{"class":619},[609,1405,1406],{"class":623},"]\n",[609,1408,1409,1412,1415,1418,1420,1422],{"class":611,"line":649},[609,1410,1411],{"class":623},"| ",[609,1413,1414],{"class":750},"where",[609,1416,1417],{"class":623}," audit.action == ",[609,1419,818],{"class":619},[609,1421,842],{"class":642},[609,1423,1424],{"class":619},"\"\n",[609,1426,1427,1429,1432,1435,1438,1441,1444,1447,1450],{"class":611,"line":670},[609,1428,1411],{"class":623},[609,1430,1431],{"class":750},"summarize",[609,1433,1434],{"class":691}," count()",[609,1436,1437],{"class":750}," by",[609,1439,1440],{"class":623}," audit.outcome, ",[609,1442,1443],{"class":691},"bin",[609,1445,1446],{"class":623},"(_time, ",[609,1448,1449],{"class":750},"1h",[609,1451,1452],{"class":623},")\n",[599,1454,1457],{"className":1387,"code":1455,"filename":1456,"language":1390,"meta":605,"style":605},"['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",[578,1458,1459,1471,1487,1500],{"__ignoreMap":605},[609,1460,1461,1463,1465,1467,1469],{"class":611,"line":612},[609,1462,1397],{"class":623},[609,1464,698],{"class":619},[609,1466,822],{"class":642},[609,1468,698],{"class":619},[609,1470,1406],{"class":623},[609,1472,1473,1475,1477,1480,1482,1485],{"class":611,"line":649},[609,1474,1411],{"class":623},[609,1476,1414],{"class":750},[609,1478,1479],{"class":623}," audit.outcome == ",[609,1481,818],{"class":619},[609,1483,1484],{"class":642},"denied",[609,1486,1424],{"class":619},[609,1488,1489,1491,1493,1495,1497],{"class":611,"line":670},[609,1490,1411],{"class":623},[609,1492,1431],{"class":750},[609,1494,1434],{"class":691},[609,1496,1437],{"class":750},[609,1498,1499],{"class":623}," audit.actor.id, audit.action\n",[609,1501,1502,1504,1507,1509,1512],{"class":611,"line":677},[609,1503,1411],{"class":623},[609,1505,1506],{"class":750},"order",[609,1508,1437],{"class":750},[609,1510,1511],{"class":623}," count_ ",[609,1513,1514],{"class":750},"desc\n",[574,1516,1517],{},"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.",[591,1519,1521],{"id":1520},"audit-logs-in-postgres","Audit logs in Postgres",[596,1523,1524,1777],{},[599,1525,1527],{"className":601,"code":1526,"filename":603,"language":604,"meta":605,"style":605},"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",[578,1528,1529,1547,1569,1573,1606,1636,1662,1692,1708,1724,1730,1735],{"__ignoreMap":605},[609,1530,1531,1533,1535,1537,1539,1541,1543,1545],{"class":611,"line":612},[609,1532,616],{"class":615},[609,1534,620],{"class":619},[609,1536,624],{"class":623},[609,1538,633],{"class":619},[609,1540,636],{"class":615},[609,1542,639],{"class":619},[609,1544,643],{"class":642},[609,1546,646],{"class":619},[609,1548,1549,1551,1554,1556,1559,1561,1563,1565,1567],{"class":611,"line":649},[609,1550,616],{"class":615},[609,1552,1553],{"class":615}," type",[609,1555,620],{"class":619},[609,1557,1558],{"class":623}," DrainContext",[609,1560,633],{"class":619},[609,1562,636],{"class":615},[609,1564,639],{"class":619},[609,1566,643],{"class":642},[609,1568,646],{"class":619},[609,1570,1571],{"class":611,"line":670},[609,1572,674],{"emptyLinePlaceholder":673},[609,1574,1575,1578,1581,1584,1587,1590,1594,1596,1598,1600,1603],{"class":611,"line":677},[609,1576,1577],{"class":821},"const",[609,1579,1580],{"class":623}," postgresAudit ",[609,1582,1583],{"class":619},"=",[609,1585,1586],{"class":821}," async",[609,1588,1589],{"class":619}," (",[609,1591,1593],{"class":1592},"sHdIc","ctx",[609,1595,733],{"class":619},[609,1597,1558],{"class":832},[609,1599,756],{"class":619},[609,1601,1602],{"class":821}," =>",[609,1604,1605],{"class":619}," {\n",[609,1607,1608,1611,1614,1616,1619,1621,1624,1626,1628,1631,1633],{"class":611,"line":713},[609,1609,1610],{"class":615},"  await",[609,1612,1613],{"class":623}," db",[609,1615,683],{"class":619},[609,1617,1618],{"class":691},"insert",[609,1620,695],{"class":729},[609,1622,1623],{"class":623},"auditEvents",[609,1625,756],{"class":729},[609,1627,683],{"class":619},[609,1629,1630],{"class":691},"values",[609,1632,695],{"class":729},[609,1634,1635],{"class":619},"{\n",[609,1637,1638,1641,1643,1646,1648,1651,1653,1655,1658,1660],{"class":611,"line":782},[609,1639,1640],{"class":729},"    id",[609,1642,733],{"class":619},[609,1644,1645],{"class":623}," ctx",[609,1647,683],{"class":619},[609,1649,1650],{"class":623},"event",[609,1652,683],{"class":619},[609,1654,822],{"class":623},[609,1656,1657],{"class":619},"!.",[609,1659,972],{"class":623},[609,1661,779],{"class":619},[609,1663,1664,1667,1669,1672,1675,1677,1679,1681,1683,1685,1688,1690],{"class":611,"line":800},[609,1665,1666],{"class":729},"    timestamp",[609,1668,733],{"class":619},[609,1670,1671],{"class":619}," new",[609,1673,1674],{"class":691}," Date",[609,1676,695],{"class":729},[609,1678,1593],{"class":623},[609,1680,683],{"class":619},[609,1682,1650],{"class":623},[609,1684,683],{"class":619},[609,1686,1687],{"class":623},"timestamp",[609,1689,756],{"class":729},[609,1691,779],{"class":619},[609,1693,1695,1698,1700,1702,1704,1706],{"class":611,"line":1694},8,[609,1696,1697],{"class":729},"    payload",[609,1699,733],{"class":619},[609,1701,1645],{"class":623},[609,1703,683],{"class":619},[609,1705,1650],{"class":623},[609,1707,779],{"class":619},[609,1709,1711,1714,1716,1718,1721],{"class":611,"line":1710},9,[609,1712,1713],{"class":619},"  }",[609,1715,756],{"class":729},[609,1717,683],{"class":619},[609,1719,1720],{"class":691},"onConflictDoNothing",[609,1722,1723],{"class":729},"()\n",[609,1725,1727],{"class":611,"line":1726},10,[609,1728,1729],{"class":619},"}\n",[609,1731,1733],{"class":611,"line":1732},11,[609,1734,674],{"emptyLinePlaceholder":673},[609,1736,1738,1740,1742,1744,1746,1748,1750,1752,1754,1756,1758,1760,1763,1765,1767,1769,1771,1773,1775],{"class":611,"line":1737},12,[609,1739,680],{"class":623},[609,1741,683],{"class":619},[609,1743,686],{"class":623},[609,1745,683],{"class":619},[609,1747,692],{"class":691},[609,1749,695],{"class":623},[609,1751,698],{"class":619},[609,1753,701],{"class":642},[609,1755,698],{"class":619},[609,1757,627],{"class":619},[609,1759,624],{"class":691},[609,1761,1762],{"class":623},"(postgresAudit",[609,1764,627],{"class":619},[609,1766,620],{"class":619},[609,1768,788],{"class":729},[609,1770,733],{"class":619},[609,1772,794],{"class":793},[609,1774,633],{"class":619},[609,1776,803],{"class":623},[599,1778,1783],{"className":1779,"code":1780,"filename":1781,"language":1782,"meta":605,"style":605},"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",[578,1784,1785,1824,1850,1858,1877,1881,1887,1892],{"__ignoreMap":605},[609,1786,1787,1790,1793,1795,1798,1801,1803,1805,1807,1810,1812,1814,1816,1819,1822],{"class":611,"line":612},[609,1788,1789],{"class":750},"SELECT",[609,1791,1792],{"class":623}," id, ",[609,1794,1687],{"class":821},[609,1796,1797],{"class":623},", payload",[609,1799,1800],{"class":619},"->",[609,1802,698],{"class":619},[609,1804,822],{"class":642},[609,1806,698],{"class":619},[609,1808,1809],{"class":619},"->>",[609,1811,698],{"class":619},[609,1813,833],{"class":642},[609,1815,698],{"class":619},[609,1817,1818],{"class":750}," AS",[609,1820,1821],{"class":750}," action",[609,1823,779],{"class":623},[609,1825,1826,1829,1831,1833,1835,1837,1839,1841,1843,1845,1847],{"class":611,"line":649},[609,1827,1828],{"class":623},"       payload",[609,1830,1800],{"class":619},[609,1832,698],{"class":619},[609,1834,822],{"class":642},[609,1836,698],{"class":619},[609,1838,1809],{"class":619},[609,1840,698],{"class":619},[609,1842,940],{"class":642},[609,1844,698],{"class":619},[609,1846,1818],{"class":750},[609,1848,1849],{"class":623}," outcome\n",[609,1851,1852,1855],{"class":611,"line":670},[609,1853,1854],{"class":750},"FROM",[609,1856,1857],{"class":623}," audit_events\n",[609,1859,1860,1863,1866,1868,1870,1872,1874],{"class":611,"line":677},[609,1861,1862],{"class":750},"WHERE",[609,1864,1865],{"class":623}," id ",[609,1867,1583],{"class":619},[609,1869,639],{"class":619},[609,1871,981],{"class":642},[609,1873,698],{"class":619},[609,1875,1876],{"class":623},";\n",[609,1878,1879],{"class":611,"line":713},[609,1880,674],{"emptyLinePlaceholder":673},[609,1882,1883],{"class":611,"line":782},[609,1884,1886],{"class":1885},"sHwdD","--          id          |       timestamp       |     action      | outcome\n",[609,1888,1889],{"class":611,"line":800},[609,1890,1891],{"class":1885},"-- ---------------------+-----------------------+-----------------+---------\n",[609,1893,1894],{"class":611,"line":1694},[609,1895,1896],{"class":1885},"--  ak_8f3c4b2a1e5d6f7c | 2026-04-24 10:23:45.6 | invoice.refund  | success\n",[574,1898,1899,1900,1902,1903,1906],{},"The deterministic ",[578,1901,972],{}," makes retries safe: duplicate inserts collapse via ",[578,1904,1905],{},"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.",[591,1908,1910],{"id":1909},"test-what-you-recorded","Test what you recorded",[574,1912,1913,1916,1917,581,1920,1923,1924,733],{},[578,1914,1915],{},"mockAudit()"," captures every audit event on emit, from standalone ",[578,1918,1919],{},"audit()",[578,1921,1922],{},"log.audit()",", and ",[578,1925,1926],{},"log.set({ audit })",[599,1928,1930],{"className":601,"code":1929,"language":604,"meta":605,"style":605},"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",[578,1931,1932,1951,1955,1980,1995,1999,2062,2066,2080,2095,2128,2143,2149,2154,2166],{"__ignoreMap":605},[609,1933,1934,1936,1938,1941,1943,1945,1947,1949],{"class":611,"line":612},[609,1935,616],{"class":615},[609,1937,620],{"class":619},[609,1939,1940],{"class":623}," mockAudit",[609,1942,633],{"class":619},[609,1944,636],{"class":615},[609,1946,639],{"class":619},[609,1948,643],{"class":642},[609,1950,646],{"class":619},[609,1952,1953],{"class":611,"line":649},[609,1954,674],{"emptyLinePlaceholder":673},[609,1956,1957,1960,1962,1964,1967,1969,1971,1973,1976,1978],{"class":611,"line":670},[609,1958,1959],{"class":691},"it",[609,1961,695],{"class":623},[609,1963,698],{"class":619},[609,1965,1966],{"class":642},"refunds the invoice and records an audit",[609,1968,698],{"class":619},[609,1970,627],{"class":619},[609,1972,1586],{"class":821},[609,1974,1975],{"class":619}," ()",[609,1977,1602],{"class":821},[609,1979,1605],{"class":619},[609,1981,1982,1985,1988,1991,1993],{"class":611,"line":677},[609,1983,1984],{"class":821},"  const",[609,1986,1987],{"class":623}," captured",[609,1989,1990],{"class":619}," =",[609,1992,1940],{"class":691},[609,1994,1723],{"class":729},[609,1996,1997],{"class":611,"line":713},[609,1998,674],{"emptyLinePlaceholder":673},[609,2000,2001,2003,2006,2008,2010,2013,2015,2017,2019,2021,2024,2026,2029,2031,2033,2035,2037,2039,2041,2043,2045,2047,2049,2051,2054,2056,2058,2060],{"class":611,"line":782},[609,2002,1610],{"class":615},[609,2004,2005],{"class":691}," refundInvoice",[609,2007,695],{"class":729},[609,2009,726],{"class":619},[609,2011,2012],{"class":729}," id",[609,2014,733],{"class":619},[609,2016,639],{"class":619},[609,2018,931],{"class":642},[609,2020,698],{"class":619},[609,2022,2023],{"class":619}," },",[609,2025,620],{"class":619},[609,2027,2028],{"class":729}," actor",[609,2030,733],{"class":619},[609,2032,620],{"class":619},[609,2034,1553],{"class":729},[609,2036,733],{"class":619},[609,2038,639],{"class":619},[609,2040,869],{"class":642},[609,2042,698],{"class":619},[609,2044,627],{"class":619},[609,2046,2012],{"class":729},[609,2048,733],{"class":619},[609,2050,639],{"class":619},[609,2052,2053],{"class":642},"u1",[609,2055,698],{"class":619},[609,2057,633],{"class":619},[609,2059,633],{"class":619},[609,2061,1452],{"class":729},[609,2063,2064],{"class":611,"line":800},[609,2065,674],{"emptyLinePlaceholder":673},[609,2067,2068,2071,2073,2076,2078],{"class":611,"line":1694},[609,2069,2070],{"class":623},"  captured",[609,2072,683],{"class":619},[609,2074,2075],{"class":691},"assertAudit",[609,2077,695],{"class":729},[609,2079,1635],{"class":619},[609,2081,2082,2085,2087,2089,2091,2093],{"class":611,"line":1710},[609,2083,2084],{"class":729},"    action",[609,2086,733],{"class":619},[609,2088,639],{"class":619},[609,2090,842],{"class":642},[609,2092,698],{"class":619},[609,2094,779],{"class":619},[609,2096,2097,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118,2120,2122,2124,2126],{"class":611,"line":1726},[609,2098,2099],{"class":729},"    target",[609,2101,733],{"class":619},[609,2103,620],{"class":619},[609,2105,1553],{"class":729},[609,2107,733],{"class":619},[609,2109,639],{"class":619},[609,2111,914],{"class":642},[609,2113,698],{"class":619},[609,2115,627],{"class":619},[609,2117,2012],{"class":729},[609,2119,733],{"class":619},[609,2121,639],{"class":619},[609,2123,931],{"class":642},[609,2125,698],{"class":619},[609,2127,797],{"class":619},[609,2129,2130,2133,2135,2137,2139,2141],{"class":611,"line":1732},[609,2131,2132],{"class":729},"    outcome",[609,2134,733],{"class":619},[609,2136,639],{"class":619},[609,2138,949],{"class":642},[609,2140,698],{"class":619},[609,2142,779],{"class":619},[609,2144,2145,2147],{"class":611,"line":1737},[609,2146,1713],{"class":619},[609,2148,1452],{"class":729},[609,2150,2152],{"class":611,"line":2151},13,[609,2153,674],{"emptyLinePlaceholder":673},[609,2155,2157,2159,2161,2164],{"class":611,"line":2156},14,[609,2158,2070],{"class":623},[609,2160,683],{"class":619},[609,2162,2163],{"class":691},"restore",[609,2165,1723],{"class":729},[609,2167,2169,2171],{"class":611,"line":2168},15,[609,2170,1376],{"class":619},[609,2172,1452],{"class":623},[574,2174,2175,2176,2179,2180,2183,2184,683],{},"Prefer ",[578,2177,2178],{},"assertAudit()"," when a missing audit should fail the test with a readable message. Use ",[578,2181,2182],{},"toIncludeAuditOf()"," when you need a boolean inside ",[578,2185,2186],{},"expect(...)",[574,2188,2189,2190,2193,2194,2197],{},"Always call ",[578,2191,2192],{},"captured.restore()"," in an ",[578,2195,2196],{},"afterEach"," (or wrap with a fixture) so a failing assertion never leaks into the next test.",[591,2199,2201],{"id":2200},"every-audit-export","Every audit export",[2203,2204,2205,2221],"table",{},[2206,2207,2208],"thead",{},[2209,2210,2211,2215,2218],"tr",{},[2212,2213,2214],"th",{},"Symbol",[2212,2216,2217],{},"Kind",[2212,2219,2220],{},"Notes",[2222,2223,2224,2237,2250,2262,2278,2290,2303,2316,2332,2349,2362,2377,2389],"tbody",{},[2209,2225,2226,2232,2234],{},[2227,2228,2229],"td",{},[578,2230,2231],{},"AuditFields",[2227,2233,860],{},[2227,2235,2236],{},"Reserved field on the wide event",[2209,2238,2239,2244,2247],{},[2227,2240,2241],{},[578,2242,2243],{},"defineAuditAction(name, opts?)",[2227,2245,2246],{},"factory",[2227,2248,2249],{},"Typed action registry, infers target shape",[2209,2251,2252,2257,2259],{},[2227,2253,2254],{},[578,2255,2256],{},"defineAuditCatalog(prefix, map)",[2227,2258,2246],{},[2227,2260,2261],{},"Bundle of typed audit actions sharing a prefix",[2209,2263,2264,2269,2272],{},[2227,2265,2266],{},[578,2267,2268],{},"log.audit(fields)",[2227,2270,2271],{},"method",[2227,2273,2274,2275,2277],{},"Sugar over ",[578,2276,1926],{}," + force-keep",[2209,2279,2280,2285,2287],{},[2227,2281,2282],{},[578,2283,2284],{},"log.audit.deny(reason, fields)",[2227,2286,2271],{},[2227,2288,2289],{},"Records a denied action",[2209,2291,2292,2297,2300],{},[2227,2293,2294],{},[578,2295,2296],{},"audit(fields)",[2227,2298,2299],{},"function",[2227,2301,2302],{},"Standalone for scripts \u002F jobs",[2209,2304,2305,2310,2313],{},[2227,2306,2307],{},[578,2308,2309],{},"withAudit({ action, target })(fn)",[2227,2311,2312],{},"wrapper",[2227,2314,2315],{},"Auto-emit success \u002F failure \u002F denied",[2209,2317,2318,2323,2326],{},[2227,2319,2320],{},[578,2321,2322],{},"auditDiff(before, after)",[2227,2324,2325],{},"helper",[2227,2327,2328,2329],{},"Redact-aware JSON Patch for ",[578,2330,2331],{},"changes",[2209,2333,2334,2338,2341],{},[2227,2335,2336],{},[578,2337,1915],{},[2227,2339,2340],{},"test util",[2227,2342,2343,2344,2346,2347],{},"Capture audits on emit; ",[578,2345,2178],{}," or ",[578,2348,2182],{},[2209,2350,2351,2356,2359],{},[2227,2352,2353],{},[578,2354,2355],{},"auditEnricher(opts?)",[2227,2357,2358],{},"enricher",[2227,2360,2361],{},"Auto-fill request \u002F runtime \u002F tenant context",[2209,2363,2364,2369,2371],{},[2227,2365,2366],{},[578,2367,2368],{},"auditOnly(drain, { await? })",[2227,2370,2312],{},[2227,2372,2373,2374,2376],{},"Routes only events with an ",[578,2375,822],{}," field",[2209,2378,2379,2384,2386],{},[2227,2380,2381],{},[578,2382,2383],{},"signed(drain, opts)",[2227,2385,2312],{},[2227,2387,2388],{},"Generic integrity wrapper (hmac \u002F hash-chain)",[2209,2390,2391,2396,2399],{},[2227,2392,2393],{},[578,2394,2395],{},"auditRedactPreset",[2227,2397,2398],{},"config",[2227,2400,2401],{},"Strict PII for audit events",[574,2403,2404,2405,2407],{},"Everything ships from the main ",[578,2406,643],{}," entrypoint.",[2409,2410,2411],"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}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":605,"searchDepth":649,"depth":649,"links":2413},[2414,2415,2416,2417,2418],{"id":593,"depth":649,"text":594},{"id":1214,"depth":649,"text":1215},{"id":1520,"depth":649,"text":1521},{"id":1909,"depth":649,"text":1910},{"id":2200,"depth":649,"text":2201},"File system, Axiom, and Postgres recipes for audit logs, plus mockAudit for tests and the full API reference.","md",[2422,2425],{"label":406,"icon":383,"to":407,"color":2423,"variant":2424},"neutral","subtle",{"label":143,"icon":141,"to":148,"color":2423,"variant":2424},{},{"title":410,"icon":79},{"title":569,"description":2419},"_5RK4jKMdGZrkk5XjLN6rkbGLur3OTXTtCRkWokVX7w",[2431,2433],{"title":406,"path":407,"stem":408,"description":2432,"icon":383,"children":-1},"Integrity, redact presets, GDPR vs append-only, retention windows, and the most common pitfalls when shipping audit logs to production.",{"title":36,"path":418,"stem":419,"description":2434,"icon":39,"children":-1},"One event per run for CLIs and automation, with privacy-safe flags, consent, an outbox, and disclosure generated from the same config.",1788966796663]