[{"data":1,"prerenderedAt":3040},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-audit-overview":500,"-use-cases-audit-overview-surround":3035},[4,30,80,118,283,415,470],{"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],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"map","\u002Fcli\u002Fmap","3.cli\u002F1.map","i-lucide-radar",{"title":94,"path":95,"stem":96,"icon":97},"Rules","\u002Fcli\u002Frules","3.cli\u002F2.rules","i-lucide-list-checks",{"title":99,"path":100,"stem":101,"icon":102},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F3.scoring","i-lucide-gauge",{"title":104,"path":105,"stem":106,"icon":107},"CI","\u002Fcli\u002Fci","3.cli\u002F4.ci","i-lucide-git-pull-request",{"title":109,"path":110,"stem":111,"icon":112},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F5.doctor","i-lucide-stethoscope",{"title":114,"path":115,"stem":116,"icon":117},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F6.telemetry","i-lucide-bar-chart-3",{"title":119,"path":120,"stem":121,"children":122,"page":29},"Integrate","\u002Fintegrate","4.integrate",[123,127,195],{"title":36,"path":124,"stem":125,"icon":126},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":128,"path":129,"stem":130,"children":131,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[132,135,175],{"title":36,"path":133,"stem":134,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":136,"path":137,"stem":138,"children":139,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[140,145,150,155,160,165,170],{"title":141,"path":142,"stem":143,"icon":144},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":146,"path":147,"stem":148,"icon":149},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","4.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":151,"path":152,"stem":153,"icon":154},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":156,"path":157,"stem":158,"icon":159},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":161,"path":162,"stem":163,"icon":164},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":166,"path":167,"stem":168,"icon":169},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":171,"path":172,"stem":173,"icon":174},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","4.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":176,"path":177,"stem":178,"children":179,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[180,185,190],{"title":181,"path":182,"stem":183,"icon":184},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":186,"path":187,"stem":188,"icon":189},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":191,"path":192,"stem":193,"icon":194},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":196,"path":197,"stem":198,"children":199,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[200,204,209,214,219,224,229,234,239,244,249,254,259,264,268,273,278],{"title":36,"path":201,"stem":202,"icon":203},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":205,"path":206,"stem":207,"icon":208},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":210,"path":211,"stem":212,"icon":213},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":215,"path":216,"stem":217,"icon":218},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":220,"path":221,"stem":222,"icon":223},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":225,"path":226,"stem":227,"icon":228},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":230,"path":231,"stem":232,"icon":233},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":235,"path":236,"stem":237,"icon":238},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":240,"path":241,"stem":242,"icon":243},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":245,"path":246,"stem":247,"icon":248},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":250,"path":251,"stem":252,"icon":253},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":255,"path":256,"stem":257,"icon":258},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":260,"path":261,"stem":262,"icon":263},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":265,"path":266,"stem":267,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":269,"path":270,"stem":271,"icon":272},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":274,"path":275,"stem":276,"icon":277},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":279,"path":280,"stem":281,"icon":282},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":284,"path":285,"stem":286,"children":287,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[288,291,296,325,352,384,405,410],{"title":36,"path":289,"stem":290,"icon":97},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":292,"path":293,"stem":294,"icon":295},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":297,"icon":298,"path":299,"stem":300,"children":301,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[302,305,310,315,320],{"title":36,"path":303,"stem":304,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":306,"path":307,"stem":308,"icon":309},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":311,"path":312,"stem":313,"icon":314},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":316,"path":317,"stem":318,"icon":319},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":321,"path":322,"stem":323,"icon":324},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":326,"icon":327,"path":328,"stem":329,"children":330,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[331,334,339,344,348],{"title":36,"path":332,"stem":333,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":335,"path":336,"stem":337,"icon":338},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":340,"path":341,"stem":342,"icon":343},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":345,"path":346,"stem":347,"icon":295},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":349,"path":350,"stem":351,"icon":102},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":353,"icon":354,"path":355,"stem":356,"children":357,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[358,361,366,371,376,380],{"title":36,"path":359,"stem":360,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":362,"path":363,"stem":364,"icon":365},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":367,"path":368,"stem":369,"icon":370},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":372,"path":373,"stem":374,"icon":375},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":377,"path":378,"stem":379,"icon":354},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":381,"path":382,"stem":383,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":321,"icon":102,"path":385,"stem":386,"children":387,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[388,391,396,401],{"title":36,"path":389,"stem":390,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":392,"path":393,"stem":394,"icon":395},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":397,"path":398,"stem":399,"icon":400},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":402,"path":403,"stem":404,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":406,"path":407,"stem":408,"icon":409},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":411,"path":412,"stem":413,"icon":414},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":416,"path":417,"stem":418,"children":419,"page":29},"Extend","\u002Fextend","6.extend",[420,424,429,434,439,443,447,451,455,460,465],{"title":36,"path":421,"stem":422,"icon":423},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":425,"path":426,"stem":427,"icon":428},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":430,"path":431,"stem":432,"icon":433},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":435,"path":436,"stem":437,"icon":438},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":381,"path":440,"stem":441,"icon":442},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":444,"path":445,"stem":446,"icon":423},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":448,"path":449,"stem":450,"icon":409},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":452,"path":453,"stem":454,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":456,"path":457,"stem":458,"icon":459},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":461,"path":462,"stem":463,"icon":464},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":466,"path":467,"stem":468,"icon":469},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":402,"path":471,"stem":472,"children":473,"page":29},"\u002Freference","7.reference",[474,479,482,487,491,496],{"title":475,"path":476,"stem":477,"icon":478},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":349,"path":480,"stem":481,"icon":102},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":483,"path":484,"stem":485,"icon":486},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":488,"path":489,"stem":490,"icon":354},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":492,"path":493,"stem":494,"icon":495},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":497,"path":498,"stem":499,"icon":409},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"id":501,"title":353,"body":502,"description":3021,"extension":3022,"links":3023,"meta":3031,"navigation":3032,"path":359,"seo":3033,"stem":360,"__hash__":3034},"docs\u002F5.use-cases\u002F4.audit\u002F01.overview.md",{"type":503,"value":504,"toc":3014},"minimark",[505,523,570,574,600,629,642,646,653,660,663,667,670,978,2875,2878,2914,2924,2927,2931,2949,2952,2956,3010],[506,507,508,509,513,514,518,519,522],"p",{},"evlog's audit layer is ",[510,511,512],"strong",{},"not a parallel system",". Audit events are wide events with a reserved ",[515,516,517],"code",{},"audit"," field. Every existing primitive — drains, enrichers, redact, tail-sampling — applies as is. Enable audit logs by adding ",[510,520,521],{},"1 enricher + 1 drain wrapper + 1 helper",".",[524,525,528,531,556],"prompt",{":actions":526,"description":527,"icon":354},"[\"copy\",\"cursor\",\"claude\"]","Add an audit log to my app",[506,529,530],{},"Add a tamper-evident audit log to my app on top of evlog.",[532,533,534,538,541,544,547,550,553],"ul",{},[535,536,537],"li",{},"Identify my framework and follow its evlog integration pattern",[535,539,540],{},"Register auditEnricher() on the evlog:enrich hook (or in initLogger.enrichers)",[535,542,543],{},"Register a separate auditOnly(signed(createFsDrain({ dir: '.audit' }), { strategy: 'hash-chain' })) drain alongside my main drain",[535,545,546],{},"Use { await: true } on the audit drain so audit events are flushed before the response returns",[535,548,549],{},"Call log.audit({ action, actor, target, outcome, reason }) for every security-sensitive action (login, role change, refund, data export, deletion)",[535,551,552],{},"Audit events are force-kept past sampling and signed via hash-chain for tamper-evidence",[535,554,555],{},"Combine with the Better Auth integration so actor.id \u002F actor.email are automatic",[506,557,558,559,565,566],{},"Docs: ",[560,561,562],"a",{"href":562,"rel":563},"https:\u002F\u002Fwww.evlog.dev\u002Fuse-cases\u002Faudit\u002Foverview",[564],"nofollow","\nAdapters: ",[560,567,568],{"href":568,"rel":569},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Foverview",[564],[571,572,497],"h2",{"id":573},"agent-skills",[506,575,576,577,582,583,586,587,590,591,596,597,522],{},"Install the evlog skill catalog so your assistant can follow ",[510,578,579],{},[515,580,581],{},"build-audit-logs"," end to end: written policy, framework wiring, ",[515,584,585],{},"withAudit"," \u002F ",[515,588,589],{},"log.audit",", denials, redaction, multi-tenant isolation, tamper-evident sinks, and grep-based review passes. If you use the file-system drain for audits or general logs, ",[510,592,593],{},[515,594,595],{},"analyze-logs"," teaches assistants to read NDJSON under ",[515,598,599],{},".evlog\u002Flogs\u002F",[601,602,608],"pre",{"className":603,"code":604,"filename":605,"language":606,"meta":607,"style":607},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx skills add https:\u002F\u002Fwww.evlog.dev\n","Terminal","bash","",[515,609,610],{"__ignoreMap":607},[611,612,615,619,623,626],"span",{"class":613,"line":614},"line",1,[611,616,618],{"class":617},"sBMFI","npx",[611,620,622],{"class":621},"sfazB"," skills",[611,624,625],{"class":621}," add",[611,627,628],{"class":621}," https:\u002F\u002Fwww.evlog.dev\n",[506,630,631,632,634,635,638,639,522],{},"See ",[560,633,497],{"href":498}," for the full list. Skill paths in the repo: ",[515,636,637],{},"skills\u002Fbuild-audit-logs",", ",[515,640,641],{},"skills\u002Fanalyze-logs",[571,643,645],{"id":644},"why-audit-logs","Why Audit Logs?",[506,647,648,649,652],{},"Compliance frameworks (SOC2, HIPAA, GDPR, PCI) require knowing ",[510,650,651],{},"who did what, on which resource, when, from where, with which outcome",". evlog covers this without a second logging library.",[654,655,656,659],"tip",{},[510,657,658],{},"An audit event is a fact about an intent, not a measurement of an operation."," A regular wide event answers \"how did this request behave?\" (latency, status, tokens). An audit event answers \"who tried to do what, and was it allowed?\". Same pipeline, different question — that's why the schema is reserved and the event is force-kept past sampling.",[661,662],"audit-force-keep",{},[571,664,666],{"id":665},"quickstart","Quickstart",[506,668,669],{},"You already use evlog. Add audit logs in three changes:",[601,671,676],{"className":672,"code":673,"filename":674,"language":675,"meta":607,"style":607},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { auditEnricher, auditOnly, signed } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createFsDrain } from 'evlog\u002Ffs'\n\nexport default defineNitroPlugin((nitro) => {\n  nitro.hooks.hook('evlog:enrich', auditEnricher())\n  nitro.hooks.hook('evlog:drain', createAxiomDrain())\n  nitro.hooks.hook('evlog:drain', auditOnly(\n    signed(createFsDrain({ dir: '.audit' }), { strategy: 'hash-chain' }),\n    { await: true },\n  ))\n})\n","server\u002Fplugins\u002Fevlog.ts","typescript",[515,677,678,718,739,760,767,799,833,861,889,945,963,969],{"__ignoreMap":607},[611,679,680,684,688,692,695,698,700,703,706,709,712,715],{"class":613,"line":614},[611,681,683],{"class":682},"s7zQu","import",[611,685,687],{"class":686},"sMK4o"," {",[611,689,691],{"class":690},"sTEyZ"," auditEnricher",[611,693,694],{"class":686},",",[611,696,697],{"class":690}," auditOnly",[611,699,694],{"class":686},[611,701,702],{"class":690}," signed",[611,704,705],{"class":686}," }",[611,707,708],{"class":682}," from",[611,710,711],{"class":686}," '",[611,713,714],{"class":621},"evlog",[611,716,717],{"class":686},"'\n",[611,719,721,723,725,728,730,732,734,737],{"class":613,"line":720},2,[611,722,683],{"class":682},[611,724,687],{"class":686},[611,726,727],{"class":690}," createAxiomDrain",[611,729,705],{"class":686},[611,731,708],{"class":682},[611,733,711],{"class":686},[611,735,736],{"class":621},"evlog\u002Faxiom",[611,738,717],{"class":686},[611,740,742,744,746,749,751,753,755,758],{"class":613,"line":741},3,[611,743,683],{"class":682},[611,745,687],{"class":686},[611,747,748],{"class":690}," createFsDrain",[611,750,705],{"class":686},[611,752,708],{"class":682},[611,754,711],{"class":686},[611,756,757],{"class":621},"evlog\u002Ffs",[611,759,717],{"class":686},[611,761,763],{"class":613,"line":762},4,[611,764,766],{"emptyLinePlaceholder":765},true,"\n",[611,768,770,773,776,780,783,785,789,792,796],{"class":613,"line":769},5,[611,771,772],{"class":682},"export",[611,774,775],{"class":682}," default",[611,777,779],{"class":778},"s2Zo4"," defineNitroPlugin",[611,781,782],{"class":690},"(",[611,784,782],{"class":686},[611,786,788],{"class":787},"sHdIc","nitro",[611,790,791],{"class":686},")",[611,793,795],{"class":794},"spNyl"," =>",[611,797,798],{"class":686}," {\n",[611,800,802,805,807,810,812,815,818,821,824,826,828,830],{"class":613,"line":801},6,[611,803,804],{"class":690},"  nitro",[611,806,522],{"class":686},[611,808,809],{"class":690},"hooks",[611,811,522],{"class":686},[611,813,814],{"class":778},"hook",[611,816,782],{"class":817},"swJcz",[611,819,820],{"class":686},"'",[611,822,823],{"class":621},"evlog:enrich",[611,825,820],{"class":686},[611,827,694],{"class":686},[611,829,691],{"class":778},[611,831,832],{"class":817},"())\n",[611,834,836,838,840,842,844,846,848,850,853,855,857,859],{"class":613,"line":835},7,[611,837,804],{"class":690},[611,839,522],{"class":686},[611,841,809],{"class":690},[611,843,522],{"class":686},[611,845,814],{"class":778},[611,847,782],{"class":817},[611,849,820],{"class":686},[611,851,852],{"class":621},"evlog:drain",[611,854,820],{"class":686},[611,856,694],{"class":686},[611,858,727],{"class":778},[611,860,832],{"class":817},[611,862,864,866,868,870,872,874,876,878,880,882,884,886],{"class":613,"line":863},8,[611,865,804],{"class":690},[611,867,522],{"class":686},[611,869,809],{"class":690},[611,871,522],{"class":686},[611,873,814],{"class":778},[611,875,782],{"class":817},[611,877,820],{"class":686},[611,879,852],{"class":621},[611,881,820],{"class":686},[611,883,694],{"class":686},[611,885,697],{"class":778},[611,887,888],{"class":817},"(\n",[611,890,892,895,897,900,902,905,908,911,913,916,918,920,922,924,926,929,931,933,936,938,940,942],{"class":613,"line":891},9,[611,893,894],{"class":778},"    signed",[611,896,782],{"class":817},[611,898,899],{"class":778},"createFsDrain",[611,901,782],{"class":817},[611,903,904],{"class":686},"{",[611,906,907],{"class":817}," dir",[611,909,910],{"class":686},":",[611,912,711],{"class":686},[611,914,915],{"class":621},".audit",[611,917,820],{"class":686},[611,919,705],{"class":686},[611,921,791],{"class":817},[611,923,694],{"class":686},[611,925,687],{"class":686},[611,927,928],{"class":817}," strategy",[611,930,910],{"class":686},[611,932,711],{"class":686},[611,934,935],{"class":621},"hash-chain",[611,937,820],{"class":686},[611,939,705],{"class":686},[611,941,791],{"class":817},[611,943,944],{"class":686},",\n",[611,946,948,951,954,956,960],{"class":613,"line":947},10,[611,949,950],{"class":686},"    {",[611,952,953],{"class":817}," await",[611,955,910],{"class":686},[611,957,959],{"class":958},"sfNiH"," true",[611,961,962],{"class":686}," },\n",[611,964,966],{"class":613,"line":965},11,[611,967,968],{"class":817},"  ))\n",[611,970,972,975],{"class":613,"line":971},12,[611,973,974],{"class":686},"}",[611,976,977],{"class":690},")\n",[979,980,981,1275,1578,1951,2262,2420],"code-group",{},[601,982,985],{"className":672,"code":983,"filename":984,"language":675,"meta":607,"style":607},"export default defineEventHandler(async (event) => {\n  const log = useLogger(event)\n  const user = await requireUser(event)\n  const invoice = await refundInvoice(getRouterParam(event, 'id'))\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  return { ok: true }\n})\n","Nuxt \u002F Nitro",[515,986,987,1013,1033,1053,1088,1092,1106,1122,1172,1206,1222,1238,1245,1250,1268],{"__ignoreMap":607},[611,988,989,991,993,996,998,1001,1004,1007,1009,1011],{"class":613,"line":614},[611,990,772],{"class":682},[611,992,775],{"class":682},[611,994,995],{"class":778}," defineEventHandler",[611,997,782],{"class":690},[611,999,1000],{"class":794},"async",[611,1002,1003],{"class":686}," (",[611,1005,1006],{"class":787},"event",[611,1008,791],{"class":686},[611,1010,795],{"class":794},[611,1012,798],{"class":686},[611,1014,1015,1018,1021,1024,1027,1029,1031],{"class":613,"line":720},[611,1016,1017],{"class":794},"  const",[611,1019,1020],{"class":690}," log",[611,1022,1023],{"class":686}," =",[611,1025,1026],{"class":778}," useLogger",[611,1028,782],{"class":817},[611,1030,1006],{"class":690},[611,1032,977],{"class":817},[611,1034,1035,1037,1040,1042,1044,1047,1049,1051],{"class":613,"line":741},[611,1036,1017],{"class":794},[611,1038,1039],{"class":690}," user",[611,1041,1023],{"class":686},[611,1043,953],{"class":682},[611,1045,1046],{"class":778}," requireUser",[611,1048,782],{"class":817},[611,1050,1006],{"class":690},[611,1052,977],{"class":817},[611,1054,1055,1057,1060,1062,1064,1067,1069,1072,1074,1076,1078,1080,1083,1085],{"class":613,"line":762},[611,1056,1017],{"class":794},[611,1058,1059],{"class":690}," invoice",[611,1061,1023],{"class":686},[611,1063,953],{"class":682},[611,1065,1066],{"class":778}," refundInvoice",[611,1068,782],{"class":817},[611,1070,1071],{"class":778},"getRouterParam",[611,1073,782],{"class":817},[611,1075,1006],{"class":690},[611,1077,694],{"class":686},[611,1079,711],{"class":686},[611,1081,1082],{"class":621},"id",[611,1084,820],{"class":686},[611,1086,1087],{"class":817},"))\n",[611,1089,1090],{"class":613,"line":769},[611,1091,766],{"emptyLinePlaceholder":765},[611,1093,1094,1097,1099,1101,1103],{"class":613,"line":801},[611,1095,1096],{"class":690},"  log",[611,1098,522],{"class":686},[611,1100,517],{"class":778},[611,1102,782],{"class":817},[611,1104,1105],{"class":686},"{\n",[611,1107,1108,1111,1113,1115,1118,1120],{"class":613,"line":835},[611,1109,1110],{"class":817},"    action",[611,1112,910],{"class":686},[611,1114,711],{"class":686},[611,1116,1117],{"class":621},"invoice.refund",[611,1119,820],{"class":686},[611,1121,944],{"class":686},[611,1123,1124,1127,1129,1131,1134,1136,1138,1141,1143,1145,1148,1150,1152,1154,1156,1158,1161,1163,1165,1167,1170],{"class":613,"line":863},[611,1125,1126],{"class":817},"    actor",[611,1128,910],{"class":686},[611,1130,687],{"class":686},[611,1132,1133],{"class":817}," type",[611,1135,910],{"class":686},[611,1137,711],{"class":686},[611,1139,1140],{"class":621},"user",[611,1142,820],{"class":686},[611,1144,694],{"class":686},[611,1146,1147],{"class":817}," id",[611,1149,910],{"class":686},[611,1151,1039],{"class":690},[611,1153,522],{"class":686},[611,1155,1082],{"class":690},[611,1157,694],{"class":686},[611,1159,1160],{"class":817}," email",[611,1162,910],{"class":686},[611,1164,1039],{"class":690},[611,1166,522],{"class":686},[611,1168,1169],{"class":690},"email",[611,1171,962],{"class":686},[611,1173,1174,1177,1179,1181,1183,1185,1187,1190,1192,1194,1196,1198,1200,1202,1204],{"class":613,"line":891},[611,1175,1176],{"class":817},"    target",[611,1178,910],{"class":686},[611,1180,687],{"class":686},[611,1182,1133],{"class":817},[611,1184,910],{"class":686},[611,1186,711],{"class":686},[611,1188,1189],{"class":621},"invoice",[611,1191,820],{"class":686},[611,1193,694],{"class":686},[611,1195,1147],{"class":817},[611,1197,910],{"class":686},[611,1199,1059],{"class":690},[611,1201,522],{"class":686},[611,1203,1082],{"class":690},[611,1205,962],{"class":686},[611,1207,1208,1211,1213,1215,1218,1220],{"class":613,"line":947},[611,1209,1210],{"class":817},"    outcome",[611,1212,910],{"class":686},[611,1214,711],{"class":686},[611,1216,1217],{"class":621},"success",[611,1219,820],{"class":686},[611,1221,944],{"class":686},[611,1223,1224,1227,1229,1231,1234,1236],{"class":613,"line":965},[611,1225,1226],{"class":817},"    reason",[611,1228,910],{"class":686},[611,1230,711],{"class":686},[611,1232,1233],{"class":621},"Customer requested refund",[611,1235,820],{"class":686},[611,1237,944],{"class":686},[611,1239,1240,1243],{"class":613,"line":971},[611,1241,1242],{"class":686},"  }",[611,1244,977],{"class":817},[611,1246,1248],{"class":613,"line":1247},13,[611,1249,766],{"emptyLinePlaceholder":765},[611,1251,1253,1256,1258,1261,1263,1265],{"class":613,"line":1252},14,[611,1254,1255],{"class":682},"  return",[611,1257,687],{"class":686},[611,1259,1260],{"class":817}," ok",[611,1262,910],{"class":686},[611,1264,959],{"class":958},[611,1266,1267],{"class":686}," }\n",[611,1269,1271,1273],{"class":613,"line":1270},15,[611,1272,974],{"class":686},[611,1274,977],{"class":690},[601,1276,1278],{"className":672,"code":1277,"filename":210,"language":675,"meta":607,"style":607},"import { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const POST = withEvlog(async (req, { params }) => {\n  const log = useLogger()\n  const user = await requireUser(req)\n  const invoice = await refundInvoice(params.id)\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  return Response.json({ ok: true })\n})\n",[515,1279,1280,1304,1308,1346,1359,1377,1400,1404,1416,1430,1474,1506,1520,1534,1540,1544,1571],{"__ignoreMap":607},[611,1281,1282,1284,1286,1289,1291,1293,1295,1297,1299,1302],{"class":613,"line":614},[611,1283,683],{"class":682},[611,1285,687],{"class":686},[611,1287,1288],{"class":690}," withEvlog",[611,1290,694],{"class":686},[611,1292,1026],{"class":690},[611,1294,705],{"class":686},[611,1296,708],{"class":682},[611,1298,711],{"class":686},[611,1300,1301],{"class":621},"@\u002Flib\u002Fevlog",[611,1303,717],{"class":686},[611,1305,1306],{"class":613,"line":720},[611,1307,766],{"emptyLinePlaceholder":765},[611,1309,1310,1312,1315,1318,1321,1323,1325,1327,1329,1332,1334,1336,1339,1342,1344],{"class":613,"line":741},[611,1311,772],{"class":682},[611,1313,1314],{"class":794}," const",[611,1316,1317],{"class":690}," POST ",[611,1319,1320],{"class":686},"=",[611,1322,1288],{"class":778},[611,1324,782],{"class":690},[611,1326,1000],{"class":794},[611,1328,1003],{"class":686},[611,1330,1331],{"class":787},"req",[611,1333,694],{"class":686},[611,1335,687],{"class":686},[611,1337,1338],{"class":787}," params",[611,1340,1341],{"class":686}," })",[611,1343,795],{"class":794},[611,1345,798],{"class":686},[611,1347,1348,1350,1352,1354,1356],{"class":613,"line":762},[611,1349,1017],{"class":794},[611,1351,1020],{"class":690},[611,1353,1023],{"class":686},[611,1355,1026],{"class":778},[611,1357,1358],{"class":817},"()\n",[611,1360,1361,1363,1365,1367,1369,1371,1373,1375],{"class":613,"line":769},[611,1362,1017],{"class":794},[611,1364,1039],{"class":690},[611,1366,1023],{"class":686},[611,1368,953],{"class":682},[611,1370,1046],{"class":778},[611,1372,782],{"class":817},[611,1374,1331],{"class":690},[611,1376,977],{"class":817},[611,1378,1379,1381,1383,1385,1387,1389,1391,1394,1396,1398],{"class":613,"line":801},[611,1380,1017],{"class":794},[611,1382,1059],{"class":690},[611,1384,1023],{"class":686},[611,1386,953],{"class":682},[611,1388,1066],{"class":778},[611,1390,782],{"class":817},[611,1392,1393],{"class":690},"params",[611,1395,522],{"class":686},[611,1397,1082],{"class":690},[611,1399,977],{"class":817},[611,1401,1402],{"class":613,"line":835},[611,1403,766],{"emptyLinePlaceholder":765},[611,1405,1406,1408,1410,1412,1414],{"class":613,"line":863},[611,1407,1096],{"class":690},[611,1409,522],{"class":686},[611,1411,517],{"class":778},[611,1413,782],{"class":817},[611,1415,1105],{"class":686},[611,1417,1418,1420,1422,1424,1426,1428],{"class":613,"line":891},[611,1419,1110],{"class":817},[611,1421,910],{"class":686},[611,1423,711],{"class":686},[611,1425,1117],{"class":621},[611,1427,820],{"class":686},[611,1429,944],{"class":686},[611,1431,1432,1434,1436,1438,1440,1442,1444,1446,1448,1450,1452,1454,1456,1458,1460,1462,1464,1466,1468,1470,1472],{"class":613,"line":947},[611,1433,1126],{"class":817},[611,1435,910],{"class":686},[611,1437,687],{"class":686},[611,1439,1133],{"class":817},[611,1441,910],{"class":686},[611,1443,711],{"class":686},[611,1445,1140],{"class":621},[611,1447,820],{"class":686},[611,1449,694],{"class":686},[611,1451,1147],{"class":817},[611,1453,910],{"class":686},[611,1455,1039],{"class":690},[611,1457,522],{"class":686},[611,1459,1082],{"class":690},[611,1461,694],{"class":686},[611,1463,1160],{"class":817},[611,1465,910],{"class":686},[611,1467,1039],{"class":690},[611,1469,522],{"class":686},[611,1471,1169],{"class":690},[611,1473,962],{"class":686},[611,1475,1476,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504],{"class":613,"line":965},[611,1477,1176],{"class":817},[611,1479,910],{"class":686},[611,1481,687],{"class":686},[611,1483,1133],{"class":817},[611,1485,910],{"class":686},[611,1487,711],{"class":686},[611,1489,1189],{"class":621},[611,1491,820],{"class":686},[611,1493,694],{"class":686},[611,1495,1147],{"class":817},[611,1497,910],{"class":686},[611,1499,1059],{"class":690},[611,1501,522],{"class":686},[611,1503,1082],{"class":690},[611,1505,962],{"class":686},[611,1507,1508,1510,1512,1514,1516,1518],{"class":613,"line":971},[611,1509,1210],{"class":817},[611,1511,910],{"class":686},[611,1513,711],{"class":686},[611,1515,1217],{"class":621},[611,1517,820],{"class":686},[611,1519,944],{"class":686},[611,1521,1522,1524,1526,1528,1530,1532],{"class":613,"line":1247},[611,1523,1226],{"class":817},[611,1525,910],{"class":686},[611,1527,711],{"class":686},[611,1529,1233],{"class":621},[611,1531,820],{"class":686},[611,1533,944],{"class":686},[611,1535,1536,1538],{"class":613,"line":1252},[611,1537,1242],{"class":686},[611,1539,977],{"class":817},[611,1541,1542],{"class":613,"line":1270},[611,1543,766],{"emptyLinePlaceholder":765},[611,1545,1547,1549,1552,1554,1557,1559,1561,1563,1565,1567,1569],{"class":613,"line":1546},16,[611,1548,1255],{"class":682},[611,1550,1551],{"class":690}," Response",[611,1553,522],{"class":686},[611,1555,1556],{"class":778},"json",[611,1558,782],{"class":817},[611,1560,904],{"class":686},[611,1562,1260],{"class":817},[611,1564,910],{"class":686},[611,1566,959],{"class":958},[611,1568,705],{"class":686},[611,1570,977],{"class":817},[611,1572,1574,1576],{"class":613,"line":1573},17,[611,1575,974],{"class":686},[611,1577,977],{"class":690},[601,1579,1581],{"className":672,"code":1580,"filename":240,"language":675,"meta":607,"style":607},"import type { EvlogVariables } from 'evlog\u002Fhono'\nimport { Hono } from 'hono'\n\nconst app = new Hono\u003CEvlogVariables>()\n\napp.post('\u002Finvoices\u002F:id\u002Frefund', async (c) => {\n  const log = c.get('log')\n  const user = await requireUser(c)\n  const invoice = await refundInvoice(c.req.param('id'))\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  return c.json({ ok: true })\n})\n",[515,1582,1583,1605,1625,1629,1655,1659,1694,1721,1739,1774,1778,1790,1804,1848,1880,1894,1908,1914,1919,1944],{"__ignoreMap":607},[611,1584,1585,1587,1589,1591,1594,1596,1598,1600,1603],{"class":613,"line":614},[611,1586,683],{"class":682},[611,1588,1133],{"class":682},[611,1590,687],{"class":686},[611,1592,1593],{"class":690}," EvlogVariables",[611,1595,705],{"class":686},[611,1597,708],{"class":682},[611,1599,711],{"class":686},[611,1601,1602],{"class":621},"evlog\u002Fhono",[611,1604,717],{"class":686},[611,1606,1607,1609,1611,1614,1616,1618,1620,1623],{"class":613,"line":720},[611,1608,683],{"class":682},[611,1610,687],{"class":686},[611,1612,1613],{"class":690}," Hono",[611,1615,705],{"class":686},[611,1617,708],{"class":682},[611,1619,711],{"class":686},[611,1621,1622],{"class":621},"hono",[611,1624,717],{"class":686},[611,1626,1627],{"class":613,"line":741},[611,1628,766],{"emptyLinePlaceholder":765},[611,1630,1631,1634,1637,1639,1642,1644,1647,1650,1653],{"class":613,"line":762},[611,1632,1633],{"class":794},"const",[611,1635,1636],{"class":690}," app ",[611,1638,1320],{"class":686},[611,1640,1641],{"class":686}," new",[611,1643,1613],{"class":778},[611,1645,1646],{"class":686},"\u003C",[611,1648,1649],{"class":617},"EvlogVariables",[611,1651,1652],{"class":686},">",[611,1654,1358],{"class":690},[611,1656,1657],{"class":613,"line":769},[611,1658,766],{"emptyLinePlaceholder":765},[611,1660,1661,1664,1666,1669,1671,1673,1676,1678,1680,1683,1685,1688,1690,1692],{"class":613,"line":801},[611,1662,1663],{"class":690},"app",[611,1665,522],{"class":686},[611,1667,1668],{"class":778},"post",[611,1670,782],{"class":690},[611,1672,820],{"class":686},[611,1674,1675],{"class":621},"\u002Finvoices\u002F:id\u002Frefund",[611,1677,820],{"class":686},[611,1679,694],{"class":686},[611,1681,1682],{"class":794}," async",[611,1684,1003],{"class":686},[611,1686,1687],{"class":787},"c",[611,1689,791],{"class":686},[611,1691,795],{"class":794},[611,1693,798],{"class":686},[611,1695,1696,1698,1700,1702,1705,1707,1710,1712,1714,1717,1719],{"class":613,"line":835},[611,1697,1017],{"class":794},[611,1699,1020],{"class":690},[611,1701,1023],{"class":686},[611,1703,1704],{"class":690}," c",[611,1706,522],{"class":686},[611,1708,1709],{"class":778},"get",[611,1711,782],{"class":817},[611,1713,820],{"class":686},[611,1715,1716],{"class":621},"log",[611,1718,820],{"class":686},[611,1720,977],{"class":817},[611,1722,1723,1725,1727,1729,1731,1733,1735,1737],{"class":613,"line":863},[611,1724,1017],{"class":794},[611,1726,1039],{"class":690},[611,1728,1023],{"class":686},[611,1730,953],{"class":682},[611,1732,1046],{"class":778},[611,1734,782],{"class":817},[611,1736,1687],{"class":690},[611,1738,977],{"class":817},[611,1740,1741,1743,1745,1747,1749,1751,1753,1755,1757,1759,1761,1764,1766,1768,1770,1772],{"class":613,"line":891},[611,1742,1017],{"class":794},[611,1744,1059],{"class":690},[611,1746,1023],{"class":686},[611,1748,953],{"class":682},[611,1750,1066],{"class":778},[611,1752,782],{"class":817},[611,1754,1687],{"class":690},[611,1756,522],{"class":686},[611,1758,1331],{"class":690},[611,1760,522],{"class":686},[611,1762,1763],{"class":778},"param",[611,1765,782],{"class":817},[611,1767,820],{"class":686},[611,1769,1082],{"class":621},[611,1771,820],{"class":686},[611,1773,1087],{"class":817},[611,1775,1776],{"class":613,"line":947},[611,1777,766],{"emptyLinePlaceholder":765},[611,1779,1780,1782,1784,1786,1788],{"class":613,"line":965},[611,1781,1096],{"class":690},[611,1783,522],{"class":686},[611,1785,517],{"class":778},[611,1787,782],{"class":817},[611,1789,1105],{"class":686},[611,1791,1792,1794,1796,1798,1800,1802],{"class":613,"line":971},[611,1793,1110],{"class":817},[611,1795,910],{"class":686},[611,1797,711],{"class":686},[611,1799,1117],{"class":621},[611,1801,820],{"class":686},[611,1803,944],{"class":686},[611,1805,1806,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830,1832,1834,1836,1838,1840,1842,1844,1846],{"class":613,"line":1247},[611,1807,1126],{"class":817},[611,1809,910],{"class":686},[611,1811,687],{"class":686},[611,1813,1133],{"class":817},[611,1815,910],{"class":686},[611,1817,711],{"class":686},[611,1819,1140],{"class":621},[611,1821,820],{"class":686},[611,1823,694],{"class":686},[611,1825,1147],{"class":817},[611,1827,910],{"class":686},[611,1829,1039],{"class":690},[611,1831,522],{"class":686},[611,1833,1082],{"class":690},[611,1835,694],{"class":686},[611,1837,1160],{"class":817},[611,1839,910],{"class":686},[611,1841,1039],{"class":690},[611,1843,522],{"class":686},[611,1845,1169],{"class":690},[611,1847,962],{"class":686},[611,1849,1850,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878],{"class":613,"line":1252},[611,1851,1176],{"class":817},[611,1853,910],{"class":686},[611,1855,687],{"class":686},[611,1857,1133],{"class":817},[611,1859,910],{"class":686},[611,1861,711],{"class":686},[611,1863,1189],{"class":621},[611,1865,820],{"class":686},[611,1867,694],{"class":686},[611,1869,1147],{"class":817},[611,1871,910],{"class":686},[611,1873,1059],{"class":690},[611,1875,522],{"class":686},[611,1877,1082],{"class":690},[611,1879,962],{"class":686},[611,1881,1882,1884,1886,1888,1890,1892],{"class":613,"line":1270},[611,1883,1210],{"class":817},[611,1885,910],{"class":686},[611,1887,711],{"class":686},[611,1889,1217],{"class":621},[611,1891,820],{"class":686},[611,1893,944],{"class":686},[611,1895,1896,1898,1900,1902,1904,1906],{"class":613,"line":1546},[611,1897,1226],{"class":817},[611,1899,910],{"class":686},[611,1901,711],{"class":686},[611,1903,1233],{"class":621},[611,1905,820],{"class":686},[611,1907,944],{"class":686},[611,1909,1910,1912],{"class":613,"line":1573},[611,1911,1242],{"class":686},[611,1913,977],{"class":817},[611,1915,1917],{"class":613,"line":1916},18,[611,1918,766],{"emptyLinePlaceholder":765},[611,1920,1922,1924,1926,1928,1930,1932,1934,1936,1938,1940,1942],{"class":613,"line":1921},19,[611,1923,1255],{"class":682},[611,1925,1704],{"class":690},[611,1927,522],{"class":686},[611,1929,1556],{"class":778},[611,1931,782],{"class":817},[611,1933,904],{"class":686},[611,1935,1260],{"class":817},[611,1937,910],{"class":686},[611,1939,959],{"class":958},[611,1941,705],{"class":686},[611,1943,977],{"class":817},[611,1945,1947,1949],{"class":613,"line":1946},20,[611,1948,974],{"class":686},[611,1950,977],{"class":690},[601,1952,1954],{"className":672,"code":1953,"filename":235,"language":675,"meta":607,"style":607},"import type { Request, Response } from 'express'\n\napp.post('\u002Finvoices\u002F:id\u002Frefund', async (req: Request, res: Response) => {\n  const log = req.log\n  const user = await requireUser(req)\n  const invoice = await refundInvoice(req.params.id)\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  res.json({ ok: true })\n})\n",[515,1955,1956,1982,1986,2029,2045,2063,2089,2093,2105,2119,2163,2195,2209,2223,2229,2233,2256],{"__ignoreMap":607},[611,1957,1958,1960,1962,1964,1967,1969,1971,1973,1975,1977,1980],{"class":613,"line":614},[611,1959,683],{"class":682},[611,1961,1133],{"class":682},[611,1963,687],{"class":686},[611,1965,1966],{"class":690}," Request",[611,1968,694],{"class":686},[611,1970,1551],{"class":690},[611,1972,705],{"class":686},[611,1974,708],{"class":682},[611,1976,711],{"class":686},[611,1978,1979],{"class":621},"express",[611,1981,717],{"class":686},[611,1983,1984],{"class":613,"line":720},[611,1985,766],{"emptyLinePlaceholder":765},[611,1987,1988,1990,1992,1994,1996,1998,2000,2002,2004,2006,2008,2010,2012,2014,2016,2019,2021,2023,2025,2027],{"class":613,"line":741},[611,1989,1663],{"class":690},[611,1991,522],{"class":686},[611,1993,1668],{"class":778},[611,1995,782],{"class":690},[611,1997,820],{"class":686},[611,1999,1675],{"class":621},[611,2001,820],{"class":686},[611,2003,694],{"class":686},[611,2005,1682],{"class":794},[611,2007,1003],{"class":686},[611,2009,1331],{"class":787},[611,2011,910],{"class":686},[611,2013,1966],{"class":617},[611,2015,694],{"class":686},[611,2017,2018],{"class":787}," res",[611,2020,910],{"class":686},[611,2022,1551],{"class":617},[611,2024,791],{"class":686},[611,2026,795],{"class":794},[611,2028,798],{"class":686},[611,2030,2031,2033,2035,2037,2040,2042],{"class":613,"line":762},[611,2032,1017],{"class":794},[611,2034,1020],{"class":690},[611,2036,1023],{"class":686},[611,2038,2039],{"class":690}," req",[611,2041,522],{"class":686},[611,2043,2044],{"class":690},"log\n",[611,2046,2047,2049,2051,2053,2055,2057,2059,2061],{"class":613,"line":769},[611,2048,1017],{"class":794},[611,2050,1039],{"class":690},[611,2052,1023],{"class":686},[611,2054,953],{"class":682},[611,2056,1046],{"class":778},[611,2058,782],{"class":817},[611,2060,1331],{"class":690},[611,2062,977],{"class":817},[611,2064,2065,2067,2069,2071,2073,2075,2077,2079,2081,2083,2085,2087],{"class":613,"line":801},[611,2066,1017],{"class":794},[611,2068,1059],{"class":690},[611,2070,1023],{"class":686},[611,2072,953],{"class":682},[611,2074,1066],{"class":778},[611,2076,782],{"class":817},[611,2078,1331],{"class":690},[611,2080,522],{"class":686},[611,2082,1393],{"class":690},[611,2084,522],{"class":686},[611,2086,1082],{"class":690},[611,2088,977],{"class":817},[611,2090,2091],{"class":613,"line":835},[611,2092,766],{"emptyLinePlaceholder":765},[611,2094,2095,2097,2099,2101,2103],{"class":613,"line":863},[611,2096,1096],{"class":690},[611,2098,522],{"class":686},[611,2100,517],{"class":778},[611,2102,782],{"class":817},[611,2104,1105],{"class":686},[611,2106,2107,2109,2111,2113,2115,2117],{"class":613,"line":891},[611,2108,1110],{"class":817},[611,2110,910],{"class":686},[611,2112,711],{"class":686},[611,2114,1117],{"class":621},[611,2116,820],{"class":686},[611,2118,944],{"class":686},[611,2120,2121,2123,2125,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161],{"class":613,"line":947},[611,2122,1126],{"class":817},[611,2124,910],{"class":686},[611,2126,687],{"class":686},[611,2128,1133],{"class":817},[611,2130,910],{"class":686},[611,2132,711],{"class":686},[611,2134,1140],{"class":621},[611,2136,820],{"class":686},[611,2138,694],{"class":686},[611,2140,1147],{"class":817},[611,2142,910],{"class":686},[611,2144,1039],{"class":690},[611,2146,522],{"class":686},[611,2148,1082],{"class":690},[611,2150,694],{"class":686},[611,2152,1160],{"class":817},[611,2154,910],{"class":686},[611,2156,1039],{"class":690},[611,2158,522],{"class":686},[611,2160,1169],{"class":690},[611,2162,962],{"class":686},[611,2164,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187,2189,2191,2193],{"class":613,"line":965},[611,2166,1176],{"class":817},[611,2168,910],{"class":686},[611,2170,687],{"class":686},[611,2172,1133],{"class":817},[611,2174,910],{"class":686},[611,2176,711],{"class":686},[611,2178,1189],{"class":621},[611,2180,820],{"class":686},[611,2182,694],{"class":686},[611,2184,1147],{"class":817},[611,2186,910],{"class":686},[611,2188,1059],{"class":690},[611,2190,522],{"class":686},[611,2192,1082],{"class":690},[611,2194,962],{"class":686},[611,2196,2197,2199,2201,2203,2205,2207],{"class":613,"line":971},[611,2198,1210],{"class":817},[611,2200,910],{"class":686},[611,2202,711],{"class":686},[611,2204,1217],{"class":621},[611,2206,820],{"class":686},[611,2208,944],{"class":686},[611,2210,2211,2213,2215,2217,2219,2221],{"class":613,"line":1247},[611,2212,1226],{"class":817},[611,2214,910],{"class":686},[611,2216,711],{"class":686},[611,2218,1233],{"class":621},[611,2220,820],{"class":686},[611,2222,944],{"class":686},[611,2224,2225,2227],{"class":613,"line":1252},[611,2226,1242],{"class":686},[611,2228,977],{"class":817},[611,2230,2231],{"class":613,"line":1270},[611,2232,766],{"emptyLinePlaceholder":765},[611,2234,2235,2238,2240,2242,2244,2246,2248,2250,2252,2254],{"class":613,"line":1546},[611,2236,2237],{"class":690},"  res",[611,2239,522],{"class":686},[611,2241,1556],{"class":778},[611,2243,782],{"class":817},[611,2245,904],{"class":686},[611,2247,1260],{"class":817},[611,2249,910],{"class":686},[611,2251,959],{"class":958},[611,2253,705],{"class":686},[611,2255,977],{"class":817},[611,2257,2258,2260],{"class":613,"line":1573},[611,2259,974],{"class":686},[611,2261,977],{"class":690},[601,2263,2266],{"className":672,"code":2264,"filename":2265,"language":675,"meta":607,"style":607},"import { audit } from 'evlog'\n\naudit({\n  action: 'invoice.refund',\n  actor: { type: 'system', id: 'billing-worker' },\n  target: { type: 'invoice', id: 'inv_889' },\n  outcome: 'success',\n  reason: 'Auto-refund triggered by chargeback webhook',\n})\n","Standalone job",[515,2267,2268,2287,2291,2299,2314,2349,2383,2398,2414],{"__ignoreMap":607},[611,2269,2270,2272,2274,2277,2279,2281,2283,2285],{"class":613,"line":614},[611,2271,683],{"class":682},[611,2273,687],{"class":686},[611,2275,2276],{"class":690}," audit",[611,2278,705],{"class":686},[611,2280,708],{"class":682},[611,2282,711],{"class":686},[611,2284,714],{"class":621},[611,2286,717],{"class":686},[611,2288,2289],{"class":613,"line":720},[611,2290,766],{"emptyLinePlaceholder":765},[611,2292,2293,2295,2297],{"class":613,"line":741},[611,2294,517],{"class":778},[611,2296,782],{"class":690},[611,2298,1105],{"class":686},[611,2300,2301,2304,2306,2308,2310,2312],{"class":613,"line":762},[611,2302,2303],{"class":817},"  action",[611,2305,910],{"class":686},[611,2307,711],{"class":686},[611,2309,1117],{"class":621},[611,2311,820],{"class":686},[611,2313,944],{"class":686},[611,2315,2316,2319,2321,2323,2325,2327,2329,2332,2334,2336,2338,2340,2342,2345,2347],{"class":613,"line":769},[611,2317,2318],{"class":817},"  actor",[611,2320,910],{"class":686},[611,2322,687],{"class":686},[611,2324,1133],{"class":817},[611,2326,910],{"class":686},[611,2328,711],{"class":686},[611,2330,2331],{"class":621},"system",[611,2333,820],{"class":686},[611,2335,694],{"class":686},[611,2337,1147],{"class":817},[611,2339,910],{"class":686},[611,2341,711],{"class":686},[611,2343,2344],{"class":621},"billing-worker",[611,2346,820],{"class":686},[611,2348,962],{"class":686},[611,2350,2351,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374,2376,2379,2381],{"class":613,"line":801},[611,2352,2353],{"class":817},"  target",[611,2355,910],{"class":686},[611,2357,687],{"class":686},[611,2359,1133],{"class":817},[611,2361,910],{"class":686},[611,2363,711],{"class":686},[611,2365,1189],{"class":621},[611,2367,820],{"class":686},[611,2369,694],{"class":686},[611,2371,1147],{"class":817},[611,2373,910],{"class":686},[611,2375,711],{"class":686},[611,2377,2378],{"class":621},"inv_889",[611,2380,820],{"class":686},[611,2382,962],{"class":686},[611,2384,2385,2388,2390,2392,2394,2396],{"class":613,"line":835},[611,2386,2387],{"class":817},"  outcome",[611,2389,910],{"class":686},[611,2391,711],{"class":686},[611,2393,1217],{"class":621},[611,2395,820],{"class":686},[611,2397,944],{"class":686},[611,2399,2400,2403,2405,2407,2410,2412],{"class":613,"line":863},[611,2401,2402],{"class":817},"  reason",[611,2404,910],{"class":686},[611,2406,711],{"class":686},[611,2408,2409],{"class":621},"Auto-refund triggered by chargeback webhook",[611,2411,820],{"class":686},[611,2413,944],{"class":686},[611,2415,2416,2418],{"class":613,"line":891},[611,2417,974],{"class":686},[611,2419,977],{"class":690},[601,2421,2425],{"className":2422,"code":2423,"filename":2424,"language":1556,"meta":607,"style":607},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"level\": \"info\",\n  \"service\": \"billing-api\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund\",\n  \"status\": 200,\n  \"duration\": \"84ms\",\n  \"requestId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\", \"email\": \"demo@example.com\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"success\",\n    \"reason\": \"Customer requested refund\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_8f3c4b2a1e5d6f7c\",\n    \"context\": {\n      \"requestId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\",\n      \"ip\": \"203.0.113.7\",\n      \"userAgent\": \"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\u002F537.36\"\n    }\n  }\n}\n","Output — wide event",[515,2426,2427,2431,2454,2474,2494,2514,2531,2551,2571,2583,2603,2667,2712,2731,2750,2766,2786,2799,2818,2838,2857,2863,2869],{"__ignoreMap":607},[611,2428,2429],{"class":613,"line":614},[611,2430,1105],{"class":686},[611,2432,2433,2436,2439,2442,2444,2447,2450,2452],{"class":613,"line":720},[611,2434,2435],{"class":686},"  \"",[611,2437,2438],{"class":794},"level",[611,2440,2441],{"class":686},"\"",[611,2443,910],{"class":686},[611,2445,2446],{"class":686}," \"",[611,2448,2449],{"class":621},"info",[611,2451,2441],{"class":686},[611,2453,944],{"class":686},[611,2455,2456,2458,2461,2463,2465,2467,2470,2472],{"class":613,"line":741},[611,2457,2435],{"class":686},[611,2459,2460],{"class":794},"service",[611,2462,2441],{"class":686},[611,2464,910],{"class":686},[611,2466,2446],{"class":686},[611,2468,2469],{"class":621},"billing-api",[611,2471,2441],{"class":686},[611,2473,944],{"class":686},[611,2475,2476,2478,2481,2483,2485,2487,2490,2492],{"class":613,"line":762},[611,2477,2435],{"class":686},[611,2479,2480],{"class":794},"method",[611,2482,2441],{"class":686},[611,2484,910],{"class":686},[611,2486,2446],{"class":686},[611,2488,2489],{"class":621},"POST",[611,2491,2441],{"class":686},[611,2493,944],{"class":686},[611,2495,2496,2498,2501,2503,2505,2507,2510,2512],{"class":613,"line":769},[611,2497,2435],{"class":686},[611,2499,2500],{"class":794},"path",[611,2502,2441],{"class":686},[611,2504,910],{"class":686},[611,2506,2446],{"class":686},[611,2508,2509],{"class":621},"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund",[611,2511,2441],{"class":686},[611,2513,944],{"class":686},[611,2515,2516,2518,2521,2523,2525,2529],{"class":613,"line":801},[611,2517,2435],{"class":686},[611,2519,2520],{"class":794},"status",[611,2522,2441],{"class":686},[611,2524,910],{"class":686},[611,2526,2528],{"class":2527},"sbssI"," 200",[611,2530,944],{"class":686},[611,2532,2533,2535,2538,2540,2542,2544,2547,2549],{"class":613,"line":835},[611,2534,2435],{"class":686},[611,2536,2537],{"class":794},"duration",[611,2539,2441],{"class":686},[611,2541,910],{"class":686},[611,2543,2446],{"class":686},[611,2545,2546],{"class":621},"84ms",[611,2548,2441],{"class":686},[611,2550,944],{"class":686},[611,2552,2553,2555,2558,2560,2562,2564,2567,2569],{"class":613,"line":863},[611,2554,2435],{"class":686},[611,2556,2557],{"class":794},"requestId",[611,2559,2441],{"class":686},[611,2561,910],{"class":686},[611,2563,2446],{"class":686},[611,2565,2566],{"class":621},"a566ef91-7765-4f59-b6f0-b9f40ce71599",[611,2568,2441],{"class":686},[611,2570,944],{"class":686},[611,2572,2573,2575,2577,2579,2581],{"class":613,"line":891},[611,2574,2435],{"class":686},[611,2576,517],{"class":794},[611,2578,2441],{"class":686},[611,2580,910],{"class":686},[611,2582,798],{"class":686},[611,2584,2585,2588,2591,2593,2595,2597,2599,2601],{"class":613,"line":947},[611,2586,2587],{"class":686},"    \"",[611,2589,2590],{"class":617},"action",[611,2592,2441],{"class":686},[611,2594,910],{"class":686},[611,2596,2446],{"class":686},[611,2598,1117],{"class":621},[611,2600,2441],{"class":686},[611,2602,944],{"class":686},[611,2604,2605,2607,2610,2612,2614,2616,2618,2621,2623,2625,2627,2629,2631,2633,2635,2637,2639,2641,2643,2646,2648,2650,2652,2654,2656,2658,2660,2663,2665],{"class":613,"line":965},[611,2606,2587],{"class":686},[611,2608,2609],{"class":617},"actor",[611,2611,2441],{"class":686},[611,2613,910],{"class":686},[611,2615,687],{"class":686},[611,2617,2446],{"class":686},[611,2619,2620],{"class":2527},"type",[611,2622,2441],{"class":686},[611,2624,910],{"class":686},[611,2626,2446],{"class":686},[611,2628,1140],{"class":621},[611,2630,2441],{"class":686},[611,2632,694],{"class":686},[611,2634,2446],{"class":686},[611,2636,1082],{"class":2527},[611,2638,2441],{"class":686},[611,2640,910],{"class":686},[611,2642,2446],{"class":686},[611,2644,2645],{"class":621},"usr_42",[611,2647,2441],{"class":686},[611,2649,694],{"class":686},[611,2651,2446],{"class":686},[611,2653,1169],{"class":2527},[611,2655,2441],{"class":686},[611,2657,910],{"class":686},[611,2659,2446],{"class":686},[611,2661,2662],{"class":621},"demo@example.com",[611,2664,2441],{"class":686},[611,2666,962],{"class":686},[611,2668,2669,2671,2674,2676,2678,2680,2682,2684,2686,2688,2690,2692,2694,2696,2698,2700,2702,2704,2706,2708,2710],{"class":613,"line":971},[611,2670,2587],{"class":686},[611,2672,2673],{"class":617},"target",[611,2675,2441],{"class":686},[611,2677,910],{"class":686},[611,2679,687],{"class":686},[611,2681,2446],{"class":686},[611,2683,2620],{"class":2527},[611,2685,2441],{"class":686},[611,2687,910],{"class":686},[611,2689,2446],{"class":686},[611,2691,1189],{"class":621},[611,2693,2441],{"class":686},[611,2695,694],{"class":686},[611,2697,2446],{"class":686},[611,2699,1082],{"class":2527},[611,2701,2441],{"class":686},[611,2703,910],{"class":686},[611,2705,2446],{"class":686},[611,2707,2378],{"class":621},[611,2709,2441],{"class":686},[611,2711,962],{"class":686},[611,2713,2714,2716,2719,2721,2723,2725,2727,2729],{"class":613,"line":1247},[611,2715,2587],{"class":686},[611,2717,2718],{"class":617},"outcome",[611,2720,2441],{"class":686},[611,2722,910],{"class":686},[611,2724,2446],{"class":686},[611,2726,1217],{"class":621},[611,2728,2441],{"class":686},[611,2730,944],{"class":686},[611,2732,2733,2735,2738,2740,2742,2744,2746,2748],{"class":613,"line":1252},[611,2734,2587],{"class":686},[611,2736,2737],{"class":617},"reason",[611,2739,2441],{"class":686},[611,2741,910],{"class":686},[611,2743,2446],{"class":686},[611,2745,1233],{"class":621},[611,2747,2441],{"class":686},[611,2749,944],{"class":686},[611,2751,2752,2754,2757,2759,2761,2764],{"class":613,"line":1270},[611,2753,2587],{"class":686},[611,2755,2756],{"class":617},"version",[611,2758,2441],{"class":686},[611,2760,910],{"class":686},[611,2762,2763],{"class":2527}," 1",[611,2765,944],{"class":686},[611,2767,2768,2770,2773,2775,2777,2779,2782,2784],{"class":613,"line":1546},[611,2769,2587],{"class":686},[611,2771,2772],{"class":617},"idempotencyKey",[611,2774,2441],{"class":686},[611,2776,910],{"class":686},[611,2778,2446],{"class":686},[611,2780,2781],{"class":621},"ak_8f3c4b2a1e5d6f7c",[611,2783,2441],{"class":686},[611,2785,944],{"class":686},[611,2787,2788,2790,2793,2795,2797],{"class":613,"line":1573},[611,2789,2587],{"class":686},[611,2791,2792],{"class":617},"context",[611,2794,2441],{"class":686},[611,2796,910],{"class":686},[611,2798,798],{"class":686},[611,2800,2801,2804,2806,2808,2810,2812,2814,2816],{"class":613,"line":1916},[611,2802,2803],{"class":686},"      \"",[611,2805,2557],{"class":2527},[611,2807,2441],{"class":686},[611,2809,910],{"class":686},[611,2811,2446],{"class":686},[611,2813,2566],{"class":621},[611,2815,2441],{"class":686},[611,2817,944],{"class":686},[611,2819,2820,2822,2825,2827,2829,2831,2834,2836],{"class":613,"line":1921},[611,2821,2803],{"class":686},[611,2823,2824],{"class":2527},"ip",[611,2826,2441],{"class":686},[611,2828,910],{"class":686},[611,2830,2446],{"class":686},[611,2832,2833],{"class":621},"203.0.113.7",[611,2835,2441],{"class":686},[611,2837,944],{"class":686},[611,2839,2840,2842,2845,2847,2849,2851,2854],{"class":613,"line":1946},[611,2841,2803],{"class":686},[611,2843,2844],{"class":2527},"userAgent",[611,2846,2441],{"class":686},[611,2848,910],{"class":686},[611,2850,2446],{"class":686},[611,2852,2853],{"class":621},"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\u002F537.36",[611,2855,2856],{"class":686},"\"\n",[611,2858,2860],{"class":613,"line":2859},21,[611,2861,2862],{"class":686},"    }\n",[611,2864,2866],{"class":613,"line":2865},22,[611,2867,2868],{"class":686},"  }\n",[611,2870,2872],{"class":613,"line":2871},23,[611,2873,2874],{"class":686},"}\n",[506,2876,2877],{},"That's it. The audit event:",[532,2879,2880,2883,2890,2897],{},[535,2881,2882],{},"Travels through the same wide-event pipeline as the rest of your logs.",[535,2884,2885,2886,2889],{},"Is ",[510,2887,2888],{},"always kept"," past tail sampling.",[535,2891,2892,2893,2896],{},"Goes to your main drain (Axiom) ",[510,2894,2895],{},"and"," to a dedicated, signed, append-only sink (FS journal).",[535,2898,2899,2900,638,2902,638,2905,2907,2908,2910,2911,522],{},"Carries ",[515,2901,2557],{},[515,2903,2904],{},"traceId",[515,2906,2824],{},", and ",[515,2909,2844],{}," automatically via ",[515,2912,2913],{},"auditEnricher",[654,2915,2916,2919,2920,2923],{},[510,2917,2918],{},"Why two drains?"," The main drain (Axiom, Datadog, ...) keeps audits next to the rest of your telemetry so dashboards and queries still work. The signed sink is your insurance: if the main drain has an outage, gets purged, or an admin quietly removes a row, the FS journal still holds the chain. Auditors want both — fast querying ",[2921,2922,2895],"em",{}," a tamper-evident artefact.",[2925,2926],"audit-dual-sink",{},[571,2928,2930],{"id":2929},"composition","Composition",[506,2932,2933,2934,2937,2938,638,2940,2907,2942,586,2945,2948],{},"Each layer is ",[510,2935,2936],{},"opt-in and replaceable",". Every node except ",[515,2939,589],{},[515,2941,2913],{},[515,2943,2944],{},"auditOnly",[515,2946,2947],{},"signed"," is shared with regular wide events.",[2950,2951],"audit-composition-flow",{},[571,2953,2955],{"id":2954},"where-to-next","Where to next",[2957,2958,2959,2967,2990,3000,3003],"card-group",{},[2960,2961,2962,2963,2966],"card",{"icon":365,"title":362,"to":363},"The ",[515,2964,2965],{},"AuditFields"," type, action naming conventions, actor types, and idempotency.",[2960,2968,2970,638,2972,2975,2976,638,2979,638,2981,638,2984,2907,2987,522],{"icon":370,"title":2969,"to":368},"Recording Events",[515,2971,589],{},[515,2973,2974],{},"log.audit.deny",", standalone ",[515,2977,2978],{},"audit()",[515,2980,585],{},[515,2982,2983],{},"defineAuditAction",[515,2985,2986],{},"defineAuditCatalog",[515,2988,2989],{},"auditDiff",[2960,2991,2993,638,2995,2907,2997,2999],{"icon":375,"title":2992,"to":373},"Drains & Integrity",[515,2994,2913],{},[515,2996,2944],{},[515,2998,2947],{}," (HMAC and hash-chain) drain wrappers.",[2960,3001,3002],{"icon":354,"title":377,"to":378},"Integrity, redact presets, GDPR vs append-only, retention, and common pitfalls.",[2960,3004,3005,3006,3009],{"icon":79,"title":381,"to":382},"FS, Axiom, and Postgres recipes — plus testing with ",[515,3007,3008],{},"mockAudit"," and the API reference.",[3011,3012,3013],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":607,"searchDepth":720,"depth":720,"links":3015},[3016,3017,3018,3019,3020],{"id":573,"depth":720,"text":497},{"id":644,"depth":720,"text":645},{"id":665,"depth":720,"text":666},{"id":2929,"depth":720,"text":2930},{"id":2954,"depth":720,"text":2955},"First-class audit logs as a thin layer on top of evlog's wide events. Add tamper-evident audit trails to any app with one enricher, one drain wrapper, and one helper.","md",[3024,3027,3028,3029,3030],{"label":362,"icon":365,"to":363,"color":3025,"variant":3026},"neutral","subtle",{"label":367,"icon":370,"to":368,"color":3025,"variant":3026},{"label":2992,"icon":375,"to":373,"color":3025,"variant":3026},{"label":377,"icon":354,"to":378,"color":3025,"variant":3026},{"label":381,"icon":79,"to":382,"color":3025,"variant":3026},{},{"title":36,"icon":39},{"title":353,"description":3021},"edqnWc1dJv6KXwNogmmjS26ZY4v57pSY6xsGqiNKzxY",[3036,3038],{"title":349,"path":350,"stem":351,"description":3037,"icon":102,"children":-1},"Watch session resolution time, enable session caching, wire the standalone Nitro hook, and combine with the AI SDK integration.",{"title":362,"path":363,"stem":364,"description":3039,"icon":365,"children":-1},"The AuditFields type, action naming conventions, actor types, idempotency, and how the schema sits inside a regular wide event.",1785014771356]