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