[{"data":1,"prerenderedAt":6051},["ShallowReactive",2],{"navigation_docs":3,"-integrate-frameworks-nextjs":538,"-integrate-frameworks-nextjs-surround":6046},[4,30,80,128,308,440,499],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"CLI","\u002Fcli","3.cli",[85,88,93,98,103,108,113,118,123],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":94,"path":95,"stem":96,"icon":97},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":99,"path":100,"stem":101,"icon":102},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":104,"path":105,"stem":106,"icon":107},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":109,"path":110,"stem":111,"icon":112},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":114,"path":115,"stem":116,"icon":117},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":119,"path":120,"stem":121,"icon":122},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":124,"path":125,"stem":126,"icon":127},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":129,"path":130,"stem":131,"children":132,"page":29},"Integrate","\u002Fintegrate","4.integrate",[133,137,220],{"title":36,"path":134,"stem":135,"icon":136},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":138,"path":139,"stem":140,"children":141,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[142,145,175,200],{"title":36,"path":143,"stem":144,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":146,"path":147,"stem":148,"children":149,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[150,155,160,165,170],{"title":151,"path":152,"stem":153,"icon":154},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":156,"path":157,"stem":158,"icon":159},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":161,"path":162,"stem":163,"icon":164},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":166,"path":167,"stem":168,"icon":169},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":171,"path":172,"stem":173,"icon":174},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":176,"path":177,"stem":178,"children":179,"page":29},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[180,185,190,195],{"title":181,"path":182,"stem":183,"icon":184},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":186,"path":187,"stem":188,"icon":189},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":191,"path":192,"stem":193,"icon":194},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":196,"path":197,"stem":198,"icon":199},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":201,"path":202,"stem":203,"children":204,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[205,210,215],{"title":206,"path":207,"stem":208,"icon":209},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":211,"path":212,"stem":213,"icon":214},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":216,"path":217,"stem":218,"icon":219},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":221,"path":222,"stem":223,"children":224,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[225,229,234,239,244,249,254,259,264,269,274,279,284,289,293,298,303],{"title":36,"path":226,"stem":227,"icon":228},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":230,"path":231,"stem":232,"icon":233},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":235,"path":236,"stem":237,"icon":238},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":240,"path":241,"stem":242,"icon":243},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":245,"path":246,"stem":247,"icon":248},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":250,"path":251,"stem":252,"icon":253},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":255,"path":256,"stem":257,"icon":258},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":260,"path":261,"stem":262,"icon":263},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":265,"path":266,"stem":267,"icon":268},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":270,"path":271,"stem":272,"icon":273},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":275,"path":276,"stem":277,"icon":278},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":280,"path":281,"stem":282,"icon":283},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":285,"path":286,"stem":287,"icon":288},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":290,"path":291,"stem":292,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":294,"path":295,"stem":296,"icon":297},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":299,"path":300,"stem":301,"icon":302},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":304,"path":305,"stem":306,"icon":307},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":309,"path":310,"stem":311,"children":312,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[313,316,321,350,377,409,430,435],{"title":36,"path":314,"stem":315,"icon":102},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":317,"path":318,"stem":319,"icon":320},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":322,"icon":323,"path":324,"stem":325,"children":326,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[327,330,335,340,345],{"title":36,"path":328,"stem":329,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":331,"path":332,"stem":333,"icon":334},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":336,"path":337,"stem":338,"icon":339},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":341,"path":342,"stem":343,"icon":344},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":346,"path":347,"stem":348,"icon":349},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":351,"icon":352,"path":353,"stem":354,"children":355,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[356,359,364,369,373],{"title":36,"path":357,"stem":358,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":360,"path":361,"stem":362,"icon":363},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":365,"path":366,"stem":367,"icon":368},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":370,"path":371,"stem":372,"icon":320},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":374,"path":375,"stem":376,"icon":107},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":378,"icon":379,"path":380,"stem":381,"children":382,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[383,386,391,396,401,405],{"title":36,"path":384,"stem":385,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":387,"path":388,"stem":389,"icon":390},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":392,"path":393,"stem":394,"icon":395},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":397,"path":398,"stem":399,"icon":400},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":402,"path":403,"stem":404,"icon":379},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":406,"path":407,"stem":408,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":346,"icon":107,"path":410,"stem":411,"children":412,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[413,416,421,426],{"title":36,"path":414,"stem":415,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":417,"path":418,"stem":419,"icon":420},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":422,"path":423,"stem":424,"icon":425},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":427,"path":428,"stem":429,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":431,"path":432,"stem":433,"icon":434},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":436,"path":437,"stem":438,"icon":439},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":441,"path":442,"stem":443,"children":444,"page":29},"Extend","\u002Fextend","6.extend",[445,449,454,459,463,468,472,476,480,484,489,494],{"title":36,"path":446,"stem":447,"icon":448},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":450,"path":451,"stem":452,"icon":453},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":455,"path":456,"stem":457,"icon":458},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":460,"path":461,"stem":462,"icon":453},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":464,"path":465,"stem":466,"icon":467},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":406,"path":469,"stem":470,"icon":471},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":473,"path":474,"stem":475,"icon":448},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":477,"path":478,"stem":479,"icon":434},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":481,"path":482,"stem":483,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":485,"path":486,"stem":487,"icon":488},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":490,"path":491,"stem":492,"icon":493},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":495,"path":496,"stem":497,"icon":498},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":427,"path":500,"stem":501,"children":502,"page":29},"\u002Freference","7.reference",[503,507,512,515,520,524,529,533],{"title":36,"path":504,"stem":505,"icon":506},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":508,"path":509,"stem":510,"icon":511},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":374,"path":513,"stem":514,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":516,"path":517,"stem":518,"icon":519},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":521,"path":522,"stem":523,"icon":379},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":525,"path":526,"stem":527,"icon":528},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":530,"path":531,"stem":532,"icon":434},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":534,"path":535,"stem":536,"icon":537},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"id":539,"title":235,"body":540,"description":6037,"extension":6038,"links":6039,"meta":6042,"navigation":6043,"path":236,"seo":6044,"stem":237,"__hash__":6045},"docs\u002F4.integrate\u002Fframeworks\u002F02.nextjs.md",{"type":541,"value":542,"toc":6008},"minimark",[543,560,607,611,616,687,691,810,814,962,966,981,1027,1031,1053,1071,1159,1271,1275,1288,1292,1299,1525,1536,1539,1577,1612,1615,1646,1690,1696,1767,1842,1846,1852,2681,2706,2709,2712,3090,3093,3173,3180,3199,3375,3379,3397,3868,3877,4003,4006,4157,4161,4174,4475,4488,4491,4507,4513,4716,4720,4723,4948,4953,4956,4969,5054,5067,5071,5076,5223,5227,5234,5422,5425,5431,5673,5677,5683,5814,5817,5901,5905,5947,5955,5965,5969,5975,6004],[544,545,546,547,551,552,555,556,559],"p",{},"evlog integrates with Next.js App Router via a ",[548,549,550],"code",{},"createEvlog()"," factory that provides ",[548,553,554],{},"withEvlog()"," handler wrapper, ",[548,557,558],{},"useLogger()",", and typed exports. One file, zero global state.",[561,562,565,568,593],"prompt",{":actions":563,"description":564,"icon":238},"[\"copy\",\"cursor\",\"claude\"]","Set up evlog in my Next.js app",[544,566,567],{},"Set up evlog in my Next.js app with wide events and structured errors.",[569,570,571,575,578,581,584,587,590],"ul",{},[572,573,574],"li",{},"Install evlog: pnpm add evlog",[572,576,577],{},"Create lib\u002Fevlog.ts with createEvlog() to export withEvlog, useLogger, createError",[572,579,580],{},"Set service name and optional sampling\u002Fdrain config",[572,582,583],{},"Wrap API route handlers with withEvlog()",[572,585,586],{},"Use useLogger() inside handlers to build wide events with log.set()",[572,588,589],{},"Throw errors with createError({ message, status, why, fix })",[572,591,592],{},"Wide events are auto-emitted when each request completes",[544,594,595,596,602,603],{},"Docs: ",[597,598,599],"a",{"href":599,"rel":600},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Fnextjs",[601],"nofollow","\nAdapters: ",[597,604,605],{"href":605,"rel":606},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Foverview",[601],[608,609,25],"h2",{"id":610},"quick-start",[612,613,615],"h3",{"id":614},"_1-install","1. Install",[617,618,619,644,658,672],"code-group",{},[620,621,627],"pre",{"className":622,"code":623,"filename":624,"language":625,"meta":626,"style":626},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog\n","pnpm","bash","",[548,628,629],{"__ignoreMap":626},[630,631,634,637,641],"span",{"class":632,"line":633},"line",1,[630,635,624],{"class":636},"sBMFI",[630,638,640],{"class":639},"sfazB"," add",[630,642,643],{"class":639}," evlog\n",[620,645,648],{"className":622,"code":646,"filename":647,"language":625,"meta":626,"style":626},"bun add evlog\n","bun",[548,649,650],{"__ignoreMap":626},[630,651,652,654,656],{"class":632,"line":633},[630,653,647],{"class":636},[630,655,640],{"class":639},[630,657,643],{"class":639},[620,659,662],{"className":622,"code":660,"filename":661,"language":625,"meta":626,"style":626},"yarn add evlog\n","yarn",[548,663,664],{"__ignoreMap":626},[630,665,666,668,670],{"class":632,"line":633},[630,667,661],{"class":636},[630,669,640],{"class":639},[630,671,643],{"class":639},[620,673,676],{"className":622,"code":674,"filename":675,"language":625,"meta":626,"style":626},"npm install evlog\n","npm",[548,677,678],{"__ignoreMap":626},[630,679,680,682,685],{"class":632,"line":633},[630,681,675],{"class":636},[630,683,684],{"class":639}," install",[630,686,643],{"class":639},[612,688,690],{"id":689},"_2-create-your-evlog-instance","2. Create your evlog instance",[620,692,697],{"className":693,"code":694,"filename":695,"language":696,"meta":626,"style":626},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createEvlog } from 'evlog\u002Fnext'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n})\n","lib\u002Fevlog.ts","typescript",[548,698,699,728,735,781,802],{"__ignoreMap":626},[630,700,701,705,709,713,716,719,722,725],{"class":632,"line":633},[630,702,704],{"class":703},"s7zQu","import",[630,706,708],{"class":707},"sMK4o"," {",[630,710,712],{"class":711},"sTEyZ"," createEvlog",[630,714,715],{"class":707}," }",[630,717,718],{"class":703}," from",[630,720,721],{"class":707}," '",[630,723,724],{"class":639},"evlog\u002Fnext",[630,726,727],{"class":707},"'\n",[630,729,731],{"class":632,"line":730},2,[630,732,734],{"emptyLinePlaceholder":733},true,"\n",[630,736,738,741,745,747,750,753,756,758,761,763,766,769,772,775,778],{"class":632,"line":737},3,[630,739,740],{"class":703},"export",[630,742,744],{"class":743},"spNyl"," const",[630,746,708],{"class":707},[630,748,749],{"class":711}," withEvlog",[630,751,752],{"class":707},",",[630,754,755],{"class":711}," useLogger",[630,757,752],{"class":707},[630,759,760],{"class":711}," log",[630,762,752],{"class":707},[630,764,765],{"class":711}," createError ",[630,767,768],{"class":707},"}",[630,770,771],{"class":707}," =",[630,773,712],{"class":774},"s2Zo4",[630,776,777],{"class":711},"(",[630,779,780],{"class":707},"{\n",[630,782,784,788,791,793,796,799],{"class":632,"line":783},4,[630,785,787],{"class":786},"swJcz","  service",[630,789,790],{"class":707},":",[630,792,721],{"class":707},[630,794,795],{"class":639},"my-app",[630,797,798],{"class":707},"'",[630,800,801],{"class":707},",\n",[630,803,805,807],{"class":632,"line":804},5,[630,806,768],{"class":707},[630,808,809],{"class":711},")\n",[612,811,813],{"id":812},"_3-wrap-a-route-handler","3. Wrap a route handler",[620,815,818],{"className":693,"code":816,"filename":817,"language":696,"meta":626,"style":626},"import { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const GET = withEvlog(async () => {\n  const log = useLogger()\n  log.set({ action: 'hello' })\n  return Response.json({ message: 'Hello!' })\n})\n","app\u002Fapi\u002Fhello\u002Froute.ts",[548,819,820,843,847,875,889,921,955],{"__ignoreMap":626},[630,821,822,824,826,828,830,832,834,836,838,841],{"class":632,"line":633},[630,823,704],{"class":703},[630,825,708],{"class":707},[630,827,749],{"class":711},[630,829,752],{"class":707},[630,831,755],{"class":711},[630,833,715],{"class":707},[630,835,718],{"class":703},[630,837,721],{"class":707},[630,839,840],{"class":639},"@\u002Flib\u002Fevlog",[630,842,727],{"class":707},[630,844,845],{"class":632,"line":730},[630,846,734],{"emptyLinePlaceholder":733},[630,848,849,851,853,856,859,861,863,866,869,872],{"class":632,"line":737},[630,850,740],{"class":703},[630,852,744],{"class":743},[630,854,855],{"class":711}," GET ",[630,857,858],{"class":707},"=",[630,860,749],{"class":774},[630,862,777],{"class":711},[630,864,865],{"class":743},"async",[630,867,868],{"class":707}," ()",[630,870,871],{"class":743}," =>",[630,873,874],{"class":707}," {\n",[630,876,877,880,882,884,886],{"class":632,"line":783},[630,878,879],{"class":743},"  const",[630,881,760],{"class":711},[630,883,771],{"class":707},[630,885,755],{"class":774},[630,887,888],{"class":786},"()\n",[630,890,891,894,897,900,902,905,908,910,912,915,917,919],{"class":632,"line":804},[630,892,893],{"class":711},"  log",[630,895,896],{"class":707},".",[630,898,899],{"class":774},"set",[630,901,777],{"class":786},[630,903,904],{"class":707},"{",[630,906,907],{"class":786}," action",[630,909,790],{"class":707},[630,911,721],{"class":707},[630,913,914],{"class":639},"hello",[630,916,798],{"class":707},[630,918,715],{"class":707},[630,920,809],{"class":786},[630,922,924,927,930,932,935,937,939,942,944,946,949,951,953],{"class":632,"line":923},6,[630,925,926],{"class":703},"  return",[630,928,929],{"class":711}," Response",[630,931,896],{"class":707},[630,933,934],{"class":774},"json",[630,936,777],{"class":786},[630,938,904],{"class":707},[630,940,941],{"class":786}," message",[630,943,790],{"class":707},[630,945,721],{"class":707},[630,947,948],{"class":639},"Hello!",[630,950,798],{"class":707},[630,952,715],{"class":707},[630,954,809],{"class":786},[630,956,958,960],{"class":632,"line":957},7,[630,959,768],{"class":707},[630,961,809],{"class":711},[608,963,965],{"id":964},"instrumentation","Instrumentation",[544,967,968,969,976,977,980],{},"Next.js supports an ",[597,970,973],{"href":971,"rel":972},"https:\u002F\u002Fnextjs.org\u002Fdocs\u002Fapp\u002Fguides\u002Finstrumentation",[601],[548,974,975],{},"instrumentation.ts"," file at the project root for server startup hooks and error reporting. evlog provides ",[548,978,979],{},"createInstrumentation()"," to integrate with this pattern.",[982,983,985,988],"callout",{"color":984,"icon":13},"info",[544,986,987],{},"These two APIs serve different purposes and can be used independently or together:",[569,989,990,1000,1015],{},[572,991,992,997,998],{},[993,994,995],"strong",{},[548,996,550],{},": per-request wide events via ",[548,999,554],{},[572,1001,1002,1006,1007,1010,1011,1014],{},[993,1003,1004],{},[548,1005,979],{},": server startup (",[548,1008,1009],{},"register()",") + unhandled error reporting (",[548,1012,1013],{},"onRequestError()",") across all routes, including SSR and RSC",[572,1016,1017,1018,1020,1021,1023,1024,896],{},"Both can coexist: ",[548,1019,1009],{}," initializes and locks the logger first, so ",[548,1022,550],{}," respects it. Each can have its own ",[548,1025,1026],{},"drain",[612,1028,1030],{"id":1029},"_1-split-instrumentation-from-route-config","1. Split instrumentation from route config",[544,1032,1033,1034,1037,1038,1040,1041,1044,1045,1048,1049,1052],{},"Keep Node-only imports (",[548,1035,1036],{},"evlog\u002Ffs",", heavy adapters) out of root ",[548,1039,975],{},". Use ",[548,1042,1043],{},"defineNodeInstrumentation"," with an options object. evlog loads ",[548,1046,1047],{},"createInstrumentation"," on Node.js only, without a visible ",[548,1050,1051],{},"import()"," in your file.",[569,1054,1055,1064],{},[572,1056,1057,1058,1060,1061],{},"Root ",[548,1059,975],{}," → ",[548,1062,1063],{},"defineNodeInstrumentation({ service, ... })",[572,1065,1066,1060,1068,1070],{},[548,1067,695],{},[548,1069,550],{}," and Node-only drains for API routes",[620,1072,1074],{"className":693,"code":1073,"filename":975,"language":696,"meta":626,"style":626},"import { defineNodeInstrumentation } from 'evlog\u002Fnext\u002Finstrumentation'\n\nexport const { register, onRequestError } = defineNodeInstrumentation({\n  service: 'my-app',\n  captureOutput: true,\n})\n",[548,1075,1076,1096,1100,1126,1140,1153],{"__ignoreMap":626},[630,1077,1078,1080,1082,1085,1087,1089,1091,1094],{"class":632,"line":633},[630,1079,704],{"class":703},[630,1081,708],{"class":707},[630,1083,1084],{"class":711}," defineNodeInstrumentation",[630,1086,715],{"class":707},[630,1088,718],{"class":703},[630,1090,721],{"class":707},[630,1092,1093],{"class":639},"evlog\u002Fnext\u002Finstrumentation",[630,1095,727],{"class":707},[630,1097,1098],{"class":632,"line":730},[630,1099,734],{"emptyLinePlaceholder":733},[630,1101,1102,1104,1106,1108,1111,1113,1116,1118,1120,1122,1124],{"class":632,"line":737},[630,1103,740],{"class":703},[630,1105,744],{"class":743},[630,1107,708],{"class":707},[630,1109,1110],{"class":711}," register",[630,1112,752],{"class":707},[630,1114,1115],{"class":711}," onRequestError ",[630,1117,768],{"class":707},[630,1119,771],{"class":707},[630,1121,1084],{"class":774},[630,1123,777],{"class":711},[630,1125,780],{"class":707},[630,1127,1128,1130,1132,1134,1136,1138],{"class":632,"line":783},[630,1129,787],{"class":786},[630,1131,790],{"class":707},[630,1133,721],{"class":707},[630,1135,795],{"class":639},[630,1137,798],{"class":707},[630,1139,801],{"class":707},[630,1141,1142,1145,1147,1151],{"class":632,"line":804},[630,1143,1144],{"class":786},"  captureOutput",[630,1146,790],{"class":707},[630,1148,1150],{"class":1149},"sfNiH"," true",[630,1152,801],{"class":707},[630,1154,1155,1157],{"class":632,"line":923},[630,1156,768],{"class":707},[630,1158,809],{"class":711},[620,1160,1162],{"className":693,"code":1161,"filename":695,"language":696,"meta":626,"style":626},"import { createEvlog } from 'evlog\u002Fnext'\nimport { createFsDrain } from 'evlog\u002Ffs'\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n  drain: createFsDrain(),\n})\n",[548,1163,1164,1182,1201,1205,1237,1251,1265],{"__ignoreMap":626},[630,1165,1166,1168,1170,1172,1174,1176,1178,1180],{"class":632,"line":633},[630,1167,704],{"class":703},[630,1169,708],{"class":707},[630,1171,712],{"class":711},[630,1173,715],{"class":707},[630,1175,718],{"class":703},[630,1177,721],{"class":707},[630,1179,724],{"class":639},[630,1181,727],{"class":707},[630,1183,1184,1186,1188,1191,1193,1195,1197,1199],{"class":632,"line":730},[630,1185,704],{"class":703},[630,1187,708],{"class":707},[630,1189,1190],{"class":711}," createFsDrain",[630,1192,715],{"class":707},[630,1194,718],{"class":703},[630,1196,721],{"class":707},[630,1198,1036],{"class":639},[630,1200,727],{"class":707},[630,1202,1203],{"class":632,"line":737},[630,1204,734],{"emptyLinePlaceholder":733},[630,1206,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235],{"class":632,"line":783},[630,1208,740],{"class":703},[630,1210,744],{"class":743},[630,1212,708],{"class":707},[630,1214,749],{"class":711},[630,1216,752],{"class":707},[630,1218,755],{"class":711},[630,1220,752],{"class":707},[630,1222,760],{"class":711},[630,1224,752],{"class":707},[630,1226,765],{"class":711},[630,1228,768],{"class":707},[630,1230,771],{"class":707},[630,1232,712],{"class":774},[630,1234,777],{"class":711},[630,1236,780],{"class":707},[630,1238,1239,1241,1243,1245,1247,1249],{"class":632,"line":804},[630,1240,787],{"class":786},[630,1242,790],{"class":707},[630,1244,721],{"class":707},[630,1246,795],{"class":639},[630,1248,798],{"class":707},[630,1250,801],{"class":707},[630,1252,1253,1256,1258,1260,1263],{"class":632,"line":923},[630,1254,1255],{"class":786},"  drain",[630,1257,790],{"class":707},[630,1259,1190],{"class":774},[630,1261,1262],{"class":711},"()",[630,1264,801],{"class":707},[630,1266,1267,1269],{"class":632,"line":957},[630,1268,768],{"class":707},[630,1270,809],{"class":711},[612,1272,1274],{"id":1273},"_2-wire-up-instrumentationts","2. Wire up instrumentation.ts",[544,1276,1277,1278,1280,1281,1283,1284,1287],{},"Next.js evaluates ",[548,1279,975],{}," in both Node.js and Edge runtimes. ",[548,1282,1043],{}," gates on ",[548,1285,1286],{},"NEXT_RUNTIME === 'nodejs'"," and loads the Node-only factory internally.",[612,1289,1291],{"id":1290},"custom-behavior-evlog-your-code","Custom behavior (evlog + your code)",[544,1293,1294,1295,1298],{},"Pass a ",[993,1296,1297],{},"loader callback"," when you need extra startup work alongside evlog:",[620,1300,1302],{"className":693,"code":1301,"filename":975,"language":696,"meta":626,"style":626},"import { defineNodeInstrumentation } from 'evlog\u002Fnext\u002Finstrumentation'\n\nexport const { register, onRequestError } = defineNodeInstrumentation(async () => {\n  const { createInstrumentation } = await import('evlog\u002Fnext\u002Finstrumentation\u002Fcreate')\n  const { register: evlogRegister, onRequestError: evlogOnRequestError } = createInstrumentation({\n    service: 'my-app',\n    captureOutput: true,\n  })\n\n  return {\n    async register() {\n      await evlogRegister()\n      \u002F\u002F e.g. OpenTelemetry, feature flags, custom one-off init\n    },\n    onRequestError: evlogOnRequestError,\n  }\n})\n",[548,1303,1304,1322,1326,1356,1386,1419,1434,1445,1453,1458,1465,1477,1487,1494,1500,1512,1518],{"__ignoreMap":626},[630,1305,1306,1308,1310,1312,1314,1316,1318,1320],{"class":632,"line":633},[630,1307,704],{"class":703},[630,1309,708],{"class":707},[630,1311,1084],{"class":711},[630,1313,715],{"class":707},[630,1315,718],{"class":703},[630,1317,721],{"class":707},[630,1319,1093],{"class":639},[630,1321,727],{"class":707},[630,1323,1324],{"class":632,"line":730},[630,1325,734],{"emptyLinePlaceholder":733},[630,1327,1328,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348,1350,1352,1354],{"class":632,"line":737},[630,1329,740],{"class":703},[630,1331,744],{"class":743},[630,1333,708],{"class":707},[630,1335,1110],{"class":711},[630,1337,752],{"class":707},[630,1339,1115],{"class":711},[630,1341,768],{"class":707},[630,1343,771],{"class":707},[630,1345,1084],{"class":774},[630,1347,777],{"class":711},[630,1349,865],{"class":743},[630,1351,868],{"class":707},[630,1353,871],{"class":743},[630,1355,874],{"class":707},[630,1357,1358,1360,1362,1365,1367,1369,1372,1375,1377,1379,1382,1384],{"class":632,"line":783},[630,1359,879],{"class":743},[630,1361,708],{"class":707},[630,1363,1364],{"class":711}," createInstrumentation",[630,1366,715],{"class":707},[630,1368,771],{"class":707},[630,1370,1371],{"class":703}," await",[630,1373,1374],{"class":707}," import",[630,1376,777],{"class":786},[630,1378,798],{"class":707},[630,1380,1381],{"class":639},"evlog\u002Fnext\u002Finstrumentation\u002Fcreate",[630,1383,798],{"class":707},[630,1385,809],{"class":786},[630,1387,1388,1390,1392,1394,1396,1399,1401,1404,1406,1409,1411,1413,1415,1417],{"class":632,"line":804},[630,1389,879],{"class":743},[630,1391,708],{"class":707},[630,1393,1110],{"class":786},[630,1395,790],{"class":707},[630,1397,1398],{"class":711}," evlogRegister",[630,1400,752],{"class":707},[630,1402,1403],{"class":786}," onRequestError",[630,1405,790],{"class":707},[630,1407,1408],{"class":711}," evlogOnRequestError",[630,1410,715],{"class":707},[630,1412,771],{"class":707},[630,1414,1364],{"class":774},[630,1416,777],{"class":786},[630,1418,780],{"class":707},[630,1420,1421,1424,1426,1428,1430,1432],{"class":632,"line":923},[630,1422,1423],{"class":786},"    service",[630,1425,790],{"class":707},[630,1427,721],{"class":707},[630,1429,795],{"class":639},[630,1431,798],{"class":707},[630,1433,801],{"class":707},[630,1435,1436,1439,1441,1443],{"class":632,"line":957},[630,1437,1438],{"class":786},"    captureOutput",[630,1440,790],{"class":707},[630,1442,1150],{"class":1149},[630,1444,801],{"class":707},[630,1446,1448,1451],{"class":632,"line":1447},8,[630,1449,1450],{"class":707},"  }",[630,1452,809],{"class":786},[630,1454,1456],{"class":632,"line":1455},9,[630,1457,734],{"emptyLinePlaceholder":733},[630,1459,1461,1463],{"class":632,"line":1460},10,[630,1462,926],{"class":703},[630,1464,874],{"class":707},[630,1466,1468,1471,1473,1475],{"class":632,"line":1467},11,[630,1469,1470],{"class":743},"    async",[630,1472,1110],{"class":786},[630,1474,1262],{"class":707},[630,1476,874],{"class":707},[630,1478,1480,1483,1485],{"class":632,"line":1479},12,[630,1481,1482],{"class":703},"      await",[630,1484,1398],{"class":774},[630,1486,888],{"class":786},[630,1488,1490],{"class":632,"line":1489},13,[630,1491,1493],{"class":1492},"sHwdD","      \u002F\u002F e.g. OpenTelemetry, feature flags, custom one-off init\n",[630,1495,1497],{"class":632,"line":1496},14,[630,1498,1499],{"class":707},"    },\n",[630,1501,1503,1506,1508,1510],{"class":632,"line":1502},15,[630,1504,1505],{"class":786},"    onRequestError",[630,1507,790],{"class":707},[630,1509,1408],{"class":711},[630,1511,801],{"class":707},[630,1513,1515],{"class":632,"line":1514},16,[630,1516,1517],{"class":707},"  }\n",[630,1519,1521,1523],{"class":632,"line":1520},17,[630,1522,768],{"class":707},[630,1524,809],{"class":711},[544,1526,1527,1528,1530,1531,1533,1534,896],{},"Keep ",[548,1529,695],{}," for ",[548,1532,550],{}," and Node-only drains. Route handlers import ",[548,1535,840],{},[544,1537,1538],{},"Next.js automatically calls these exports:",[569,1540,1541,1558],{},[572,1542,1543,1545,1546,1549,1550,1553,1554,1557],{},[548,1544,1009],{},": Runs once when the server starts. Initializes the evlog logger with your configured drain, sampling, and options. When ",[548,1547,1548],{},"captureOutput"," is enabled, ",[548,1551,1552],{},"stdout"," and ",[548,1555,1556],{},"stderr"," writes are captured as structured log events.",[572,1559,1560,1562,1563,1566,1567,1566,1570,1566,1573,1576],{},[548,1561,1013],{},": Called on every unhandled request error. Emits a structured error log with the error message, digest, stack trace, request path\u002Fmethod, and routing context (",[548,1564,1565],{},"routerKind",", ",[548,1568,1569],{},"routePath",[548,1571,1572],{},"routeType",[548,1574,1575],{},"renderSource",").",[982,1578,1579,1581,1582,1584,1585,1553,1588,1591,1592,1595,1596,1599,1600,1603,1604,1607,1608,1611],{"color":984,"icon":13},[548,1580,1548],{}," only activates in the Node.js runtime (",[548,1583,1286],{},"). It patches ",[548,1586,1587],{},"process.stdout.write",[548,1589,1590],{},"process.stderr.write"," to emit structured ",[548,1593,1594],{},"log.info"," \u002F ",[548,1597,1598],{},"log.error"," events. When ",[548,1601,1602],{},"silent"," is ",[548,1605,1606],{},"false"," (the default), captured output is shown once as structured terminal output, and the raw write is not duplicated. Set ",[548,1609,1610],{},"silent: true"," to keep the original passthrough alongside drain delivery. Known Next.js Edge bundler warnings are filtered by default so they are not re-emitted as evlog errors.",[612,1613,508],{"id":1614},"configuration",[544,1616,1617,1553,1620,1622,1623,1566,1626,1566,1629,1566,1632,1566,1635,1566,1637,1566,1640,1566,1643,1645],{},[548,1618,1619],{},"defineNodeInstrumentation()",[548,1621,979],{}," accept global logger options (",[548,1624,1625],{},"enabled",[548,1627,1628],{},"service",[548,1630,1631],{},"env",[548,1633,1634],{},"pretty",[548,1636,1602],{},[548,1638,1639],{},"sampling",[548,1641,1642],{},"stringify",[548,1644,1026],{},") plus:",[1647,1648,1649,1668],"table",{},[1650,1651,1652],"thead",{},[1653,1654,1655,1659,1662,1665],"tr",{},[1656,1657,1658],"th",{},"Option",[1656,1660,1661],{},"Type",[1656,1663,1664],{},"Default",[1656,1666,1667],{},"Description",[1669,1670,1671],"tbody",{},[1653,1672,1673,1678,1683,1687],{},[1674,1675,1676],"td",{},[548,1677,1548],{},[1674,1679,1680],{},[548,1681,1682],{},"boolean | CaptureOutputOptions",[1674,1684,1685],{},[548,1686,1606],{},[1674,1688,1689],{},"Capture stdout\u002Fstderr as structured log events",[544,1691,1692,1695],{},[548,1693,1694],{},"CaptureOutputOptions"," fields:",[1647,1697,1698,1711],{},[1650,1699,1700],{},[1653,1701,1702,1705,1707,1709],{},[1656,1703,1704],{},"Field",[1656,1706,1661],{},[1656,1708,1664],{},[1656,1710,1667],{},[1669,1712,1713,1732,1749],{},[1653,1714,1715,1719,1724,1729],{},[1674,1716,1717],{},[548,1718,1552],{},[1674,1720,1721],{},[548,1722,1723],{},"boolean",[1674,1725,1726],{},[548,1727,1728],{},"true",[1674,1730,1731],{},"Capture stdout writes",[1653,1733,1734,1738,1742,1746],{},[1674,1735,1736],{},[548,1737,1556],{},[1674,1739,1740],{},[548,1741,1723],{},[1674,1743,1744],{},[548,1745,1728],{},[1674,1747,1748],{},"Capture stderr writes",[1653,1750,1751,1756,1761,1764],{},[1674,1752,1753],{},[548,1754,1755],{},"ignore",[1674,1757,1758],{},[548,1759,1760],{},"(string | RegExp)[]",[1674,1762,1763],{},"Next.js Edge bundler warnings",[1674,1765,1766],{},"Skip re-emitting matching chunks as log events",[620,1768,1770],{"className":693,"code":1769,"filename":975,"language":696,"meta":626,"style":626},"defineNodeInstrumentation({\n  captureOutput: {\n    stderr: true,\n    ignore: [\u002Fmy-noisy-dep\u002F, 'benign warning'],\n  },\n})\n",[548,1771,1772,1780,1788,1799,1831,1836],{"__ignoreMap":626},[630,1773,1774,1776,1778],{"class":632,"line":633},[630,1775,1043],{"class":774},[630,1777,777],{"class":711},[630,1779,780],{"class":707},[630,1781,1782,1784,1786],{"class":632,"line":730},[630,1783,1144],{"class":786},[630,1785,790],{"class":707},[630,1787,874],{"class":707},[630,1789,1790,1793,1795,1797],{"class":632,"line":737},[630,1791,1792],{"class":786},"    stderr",[630,1794,790],{"class":707},[630,1796,1150],{"class":1149},[630,1798,801],{"class":707},[630,1800,1801,1804,1806,1809,1812,1815,1817,1819,1821,1824,1826,1829],{"class":632,"line":783},[630,1802,1803],{"class":786},"    ignore",[630,1805,790],{"class":707},[630,1807,1808],{"class":711}," [",[630,1810,1811],{"class":707},"\u002F",[630,1813,1814],{"class":639},"my-noisy-dep",[630,1816,1811],{"class":707},[630,1818,752],{"class":707},[630,1820,721],{"class":707},[630,1822,1823],{"class":639},"benign warning",[630,1825,798],{"class":707},[630,1827,1828],{"class":711},"]",[630,1830,801],{"class":707},[630,1832,1833],{"class":632,"line":804},[630,1834,1835],{"class":707},"  },\n",[630,1837,1838,1840],{"class":632,"line":923},[630,1839,768],{"class":707},[630,1841,809],{"class":711},[608,1843,1845],{"id":1844},"production-configuration","Production Configuration",[544,1847,1848,1849,1851],{},"A real-world ",[548,1850,695],{}," with enrichers, batched drain, tail sampling, and route-based service names:",[1853,1854,1855],"code-collapse",{},[620,1856,1858],{"className":693,"code":1857,"filename":695,"language":696,"meta":626,"style":626},"import type { DrainContext } from 'evlog'\nimport { createEvlog } from 'evlog\u002Fnext'\nimport { createUserAgentEnricher, createRequestSizeEnricher } from 'evlog\u002Fenrichers'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\n\u002F\u002F 1. Enrichers - add derived context to every event\nconst enrichers = [createUserAgentEnricher(), createRequestSizeEnricher()]\n\n\u002F\u002F 2. Pipeline - batch events before sending\nconst pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 50, intervalMs: 5000 } })\n\n\u002F\u002F 3. Drain - send batched events to Axiom\nconst drain = pipeline(createAxiomDrain({\n  dataset: 'logs',\n  apiKey: process.env.AXIOM_API_KEY!,\n}))\n\nexport const { withEvlog, useLogger, log, createError } = createEvlog({\n  service: 'my-app',\n\n  \u002F\u002F 4. Head sampling - keep 10% of info logs\n  sampling: {\n    rates: { info: 10 },\n    keep: [\n      { status: 400 },              \u002F\u002F Always keep errors\n      { duration: 1000 },           \u002F\u002F Always keep slow requests\n      { path: '\u002Fapi\u002Fcritical\u002F**' }, \u002F\u002F Always keep critical paths\n    ],\n  },\n\n  \u002F\u002F 5. Route-based service names\n  routes: {\n    '\u002Fapi\u002Fauth\u002F**': { service: 'auth-service' },\n    '\u002Fapi\u002Fpayment\u002F**': { service: 'payment-service' },\n    '\u002Fapi\u002Fbooking\u002F**': { service: 'booking-service' },\n  },\n\n  \u002F\u002F 6. Custom tail sampling - business logic\n  keep: (ctx) => {\n    const user = ctx.context.user as { premium?: boolean } | undefined\n    if (user?.premium) ctx.shouldKeep = true\n  },\n\n  \u002F\u002F 7. Enrich every event with user agent, request size, and deployment info\n  enrich: (ctx) => {\n    for (const enricher of enrichers) enricher(ctx)\n    ctx.event.deploymentId = process.env.VERCEL_DEPLOYMENT_ID\n    ctx.event.region = process.env.VERCEL_REGION\n  },\n\n  drain,\n})\n",[548,1859,1860,1883,1901,1926,1946,1966,1970,1975,1999,2003,2008,2064,2068,2073,2094,2110,2132,2139,2144,2177,2192,2197,2203,2213,2234,2245,2265,2283,2305,2313,2318,2323,2329,2339,2368,2395,2422,2427,2432,2438,2460,2506,2537,2542,2547,2553,2571,2601,2630,2657,2662,2667,2674],{"__ignoreMap":626},[630,1861,1862,1864,1867,1869,1872,1874,1876,1878,1881],{"class":632,"line":633},[630,1863,704],{"class":703},[630,1865,1866],{"class":703}," type",[630,1868,708],{"class":707},[630,1870,1871],{"class":711}," DrainContext",[630,1873,715],{"class":707},[630,1875,718],{"class":703},[630,1877,721],{"class":707},[630,1879,1880],{"class":639},"evlog",[630,1882,727],{"class":707},[630,1884,1885,1887,1889,1891,1893,1895,1897,1899],{"class":632,"line":730},[630,1886,704],{"class":703},[630,1888,708],{"class":707},[630,1890,712],{"class":711},[630,1892,715],{"class":707},[630,1894,718],{"class":703},[630,1896,721],{"class":707},[630,1898,724],{"class":639},[630,1900,727],{"class":707},[630,1902,1903,1905,1907,1910,1912,1915,1917,1919,1921,1924],{"class":632,"line":737},[630,1904,704],{"class":703},[630,1906,708],{"class":707},[630,1908,1909],{"class":711}," createUserAgentEnricher",[630,1911,752],{"class":707},[630,1913,1914],{"class":711}," createRequestSizeEnricher",[630,1916,715],{"class":707},[630,1918,718],{"class":703},[630,1920,721],{"class":707},[630,1922,1923],{"class":639},"evlog\u002Fenrichers",[630,1925,727],{"class":707},[630,1927,1928,1930,1932,1935,1937,1939,1941,1944],{"class":632,"line":783},[630,1929,704],{"class":703},[630,1931,708],{"class":707},[630,1933,1934],{"class":711}," createAxiomDrain",[630,1936,715],{"class":707},[630,1938,718],{"class":703},[630,1940,721],{"class":707},[630,1942,1943],{"class":639},"evlog\u002Faxiom",[630,1945,727],{"class":707},[630,1947,1948,1950,1952,1955,1957,1959,1961,1964],{"class":632,"line":804},[630,1949,704],{"class":703},[630,1951,708],{"class":707},[630,1953,1954],{"class":711}," createDrainPipeline",[630,1956,715],{"class":707},[630,1958,718],{"class":703},[630,1960,721],{"class":707},[630,1962,1963],{"class":639},"evlog\u002Fpipeline",[630,1965,727],{"class":707},[630,1967,1968],{"class":632,"line":923},[630,1969,734],{"emptyLinePlaceholder":733},[630,1971,1972],{"class":632,"line":957},[630,1973,1974],{"class":1492},"\u002F\u002F 1. Enrichers - add derived context to every event\n",[630,1976,1977,1980,1983,1985,1987,1990,1992,1994,1996],{"class":632,"line":1447},[630,1978,1979],{"class":743},"const",[630,1981,1982],{"class":711}," enrichers ",[630,1984,858],{"class":707},[630,1986,1808],{"class":711},[630,1988,1989],{"class":774},"createUserAgentEnricher",[630,1991,1262],{"class":711},[630,1993,752],{"class":707},[630,1995,1914],{"class":774},[630,1997,1998],{"class":711},"()]\n",[630,2000,2001],{"class":632,"line":1455},[630,2002,734],{"emptyLinePlaceholder":733},[630,2004,2005],{"class":632,"line":1460},[630,2006,2007],{"class":1492},"\u002F\u002F 2. Pipeline - batch events before sending\n",[630,2009,2010,2012,2015,2017,2019,2022,2025,2028,2030,2032,2035,2037,2039,2042,2044,2048,2050,2053,2055,2058,2060,2062],{"class":632,"line":1467},[630,2011,1979],{"class":743},[630,2013,2014],{"class":711}," pipeline ",[630,2016,858],{"class":707},[630,2018,1954],{"class":774},[630,2020,2021],{"class":707},"\u003C",[630,2023,2024],{"class":636},"DrainContext",[630,2026,2027],{"class":707},">",[630,2029,777],{"class":711},[630,2031,904],{"class":707},[630,2033,2034],{"class":786}," batch",[630,2036,790],{"class":707},[630,2038,708],{"class":707},[630,2040,2041],{"class":786}," size",[630,2043,790],{"class":707},[630,2045,2047],{"class":2046},"sbssI"," 50",[630,2049,752],{"class":707},[630,2051,2052],{"class":786}," intervalMs",[630,2054,790],{"class":707},[630,2056,2057],{"class":2046}," 5000",[630,2059,715],{"class":707},[630,2061,715],{"class":707},[630,2063,809],{"class":711},[630,2065,2066],{"class":632,"line":1479},[630,2067,734],{"emptyLinePlaceholder":733},[630,2069,2070],{"class":632,"line":1489},[630,2071,2072],{"class":1492},"\u002F\u002F 3. Drain - send batched events to Axiom\n",[630,2074,2075,2077,2080,2082,2085,2087,2090,2092],{"class":632,"line":1496},[630,2076,1979],{"class":743},[630,2078,2079],{"class":711}," drain ",[630,2081,858],{"class":707},[630,2083,2084],{"class":774}," pipeline",[630,2086,777],{"class":711},[630,2088,2089],{"class":774},"createAxiomDrain",[630,2091,777],{"class":711},[630,2093,780],{"class":707},[630,2095,2096,2099,2101,2103,2106,2108],{"class":632,"line":1502},[630,2097,2098],{"class":786},"  dataset",[630,2100,790],{"class":707},[630,2102,721],{"class":707},[630,2104,2105],{"class":639},"logs",[630,2107,798],{"class":707},[630,2109,801],{"class":707},[630,2111,2112,2115,2117,2120,2122,2124,2126,2129],{"class":632,"line":1514},[630,2113,2114],{"class":786},"  apiKey",[630,2116,790],{"class":707},[630,2118,2119],{"class":711}," process",[630,2121,896],{"class":707},[630,2123,1631],{"class":711},[630,2125,896],{"class":707},[630,2127,2128],{"class":711},"AXIOM_API_KEY",[630,2130,2131],{"class":707},"!,\n",[630,2133,2134,2136],{"class":632,"line":1520},[630,2135,768],{"class":707},[630,2137,2138],{"class":711},"))\n",[630,2140,2142],{"class":632,"line":2141},18,[630,2143,734],{"emptyLinePlaceholder":733},[630,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163,2165,2167,2169,2171,2173,2175],{"class":632,"line":2146},19,[630,2148,740],{"class":703},[630,2150,744],{"class":743},[630,2152,708],{"class":707},[630,2154,749],{"class":711},[630,2156,752],{"class":707},[630,2158,755],{"class":711},[630,2160,752],{"class":707},[630,2162,760],{"class":711},[630,2164,752],{"class":707},[630,2166,765],{"class":711},[630,2168,768],{"class":707},[630,2170,771],{"class":707},[630,2172,712],{"class":774},[630,2174,777],{"class":711},[630,2176,780],{"class":707},[630,2178,2180,2182,2184,2186,2188,2190],{"class":632,"line":2179},20,[630,2181,787],{"class":786},[630,2183,790],{"class":707},[630,2185,721],{"class":707},[630,2187,795],{"class":639},[630,2189,798],{"class":707},[630,2191,801],{"class":707},[630,2193,2195],{"class":632,"line":2194},21,[630,2196,734],{"emptyLinePlaceholder":733},[630,2198,2200],{"class":632,"line":2199},22,[630,2201,2202],{"class":1492},"  \u002F\u002F 4. Head sampling - keep 10% of info logs\n",[630,2204,2206,2209,2211],{"class":632,"line":2205},23,[630,2207,2208],{"class":786},"  sampling",[630,2210,790],{"class":707},[630,2212,874],{"class":707},[630,2214,2216,2219,2221,2223,2226,2228,2231],{"class":632,"line":2215},24,[630,2217,2218],{"class":786},"    rates",[630,2220,790],{"class":707},[630,2222,708],{"class":707},[630,2224,2225],{"class":786}," info",[630,2227,790],{"class":707},[630,2229,2230],{"class":2046}," 10",[630,2232,2233],{"class":707}," },\n",[630,2235,2237,2240,2242],{"class":632,"line":2236},25,[630,2238,2239],{"class":786},"    keep",[630,2241,790],{"class":707},[630,2243,2244],{"class":711}," [\n",[630,2246,2248,2251,2254,2256,2259,2262],{"class":632,"line":2247},26,[630,2249,2250],{"class":707},"      {",[630,2252,2253],{"class":786}," status",[630,2255,790],{"class":707},[630,2257,2258],{"class":2046}," 400",[630,2260,2261],{"class":707}," },",[630,2263,2264],{"class":1492},"              \u002F\u002F Always keep errors\n",[630,2266,2268,2270,2273,2275,2278,2280],{"class":632,"line":2267},27,[630,2269,2250],{"class":707},[630,2271,2272],{"class":786}," duration",[630,2274,790],{"class":707},[630,2276,2277],{"class":2046}," 1000",[630,2279,2261],{"class":707},[630,2281,2282],{"class":1492},"           \u002F\u002F Always keep slow requests\n",[630,2284,2286,2288,2291,2293,2295,2298,2300,2302],{"class":632,"line":2285},28,[630,2287,2250],{"class":707},[630,2289,2290],{"class":786}," path",[630,2292,790],{"class":707},[630,2294,721],{"class":707},[630,2296,2297],{"class":639},"\u002Fapi\u002Fcritical\u002F**",[630,2299,798],{"class":707},[630,2301,2261],{"class":707},[630,2303,2304],{"class":1492}," \u002F\u002F Always keep critical paths\n",[630,2306,2308,2311],{"class":632,"line":2307},29,[630,2309,2310],{"class":711},"    ]",[630,2312,801],{"class":707},[630,2314,2316],{"class":632,"line":2315},30,[630,2317,1835],{"class":707},[630,2319,2321],{"class":632,"line":2320},31,[630,2322,734],{"emptyLinePlaceholder":733},[630,2324,2326],{"class":632,"line":2325},32,[630,2327,2328],{"class":1492},"  \u002F\u002F 5. Route-based service names\n",[630,2330,2332,2335,2337],{"class":632,"line":2331},33,[630,2333,2334],{"class":786},"  routes",[630,2336,790],{"class":707},[630,2338,874],{"class":707},[630,2340,2342,2345,2348,2350,2352,2354,2357,2359,2361,2364,2366],{"class":632,"line":2341},34,[630,2343,2344],{"class":707},"    '",[630,2346,2347],{"class":786},"\u002Fapi\u002Fauth\u002F**",[630,2349,798],{"class":707},[630,2351,790],{"class":707},[630,2353,708],{"class":707},[630,2355,2356],{"class":786}," service",[630,2358,790],{"class":707},[630,2360,721],{"class":707},[630,2362,2363],{"class":639},"auth-service",[630,2365,798],{"class":707},[630,2367,2233],{"class":707},[630,2369,2371,2373,2376,2378,2380,2382,2384,2386,2388,2391,2393],{"class":632,"line":2370},35,[630,2372,2344],{"class":707},[630,2374,2375],{"class":786},"\u002Fapi\u002Fpayment\u002F**",[630,2377,798],{"class":707},[630,2379,790],{"class":707},[630,2381,708],{"class":707},[630,2383,2356],{"class":786},[630,2385,790],{"class":707},[630,2387,721],{"class":707},[630,2389,2390],{"class":639},"payment-service",[630,2392,798],{"class":707},[630,2394,2233],{"class":707},[630,2396,2398,2400,2403,2405,2407,2409,2411,2413,2415,2418,2420],{"class":632,"line":2397},36,[630,2399,2344],{"class":707},[630,2401,2402],{"class":786},"\u002Fapi\u002Fbooking\u002F**",[630,2404,798],{"class":707},[630,2406,790],{"class":707},[630,2408,708],{"class":707},[630,2410,2356],{"class":786},[630,2412,790],{"class":707},[630,2414,721],{"class":707},[630,2416,2417],{"class":639},"booking-service",[630,2419,798],{"class":707},[630,2421,2233],{"class":707},[630,2423,2425],{"class":632,"line":2424},37,[630,2426,1835],{"class":707},[630,2428,2430],{"class":632,"line":2429},38,[630,2431,734],{"emptyLinePlaceholder":733},[630,2433,2435],{"class":632,"line":2434},39,[630,2436,2437],{"class":1492},"  \u002F\u002F 6. Custom tail sampling - business logic\n",[630,2439,2441,2444,2446,2449,2453,2456,2458],{"class":632,"line":2440},40,[630,2442,2443],{"class":774},"  keep",[630,2445,790],{"class":707},[630,2447,2448],{"class":707}," (",[630,2450,2452],{"class":2451},"sHdIc","ctx",[630,2454,2455],{"class":707},")",[630,2457,871],{"class":743},[630,2459,874],{"class":707},[630,2461,2463,2466,2469,2471,2474,2476,2479,2481,2484,2487,2489,2492,2495,2498,2500,2503],{"class":632,"line":2462},41,[630,2464,2465],{"class":743},"    const",[630,2467,2468],{"class":711}," user",[630,2470,771],{"class":707},[630,2472,2473],{"class":711}," ctx",[630,2475,896],{"class":707},[630,2477,2478],{"class":711},"context",[630,2480,896],{"class":707},[630,2482,2483],{"class":711},"user",[630,2485,2486],{"class":703}," as",[630,2488,708],{"class":707},[630,2490,2491],{"class":786}," premium",[630,2493,2494],{"class":707},"?:",[630,2496,2497],{"class":636}," boolean",[630,2499,715],{"class":707},[630,2501,2502],{"class":707}," |",[630,2504,2505],{"class":636}," undefined\n",[630,2507,2509,2512,2514,2516,2519,2522,2525,2527,2529,2532,2534],{"class":632,"line":2508},42,[630,2510,2511],{"class":703},"    if",[630,2513,2448],{"class":786},[630,2515,2483],{"class":711},[630,2517,2518],{"class":707},"?.",[630,2520,2521],{"class":711},"premium",[630,2523,2524],{"class":786},") ",[630,2526,2452],{"class":711},[630,2528,896],{"class":707},[630,2530,2531],{"class":711},"shouldKeep",[630,2533,771],{"class":707},[630,2535,2536],{"class":1149}," true\n",[630,2538,2540],{"class":632,"line":2539},43,[630,2541,1835],{"class":707},[630,2543,2545],{"class":632,"line":2544},44,[630,2546,734],{"emptyLinePlaceholder":733},[630,2548,2550],{"class":632,"line":2549},45,[630,2551,2552],{"class":1492},"  \u002F\u002F 7. Enrich every event with user agent, request size, and deployment info\n",[630,2554,2556,2559,2561,2563,2565,2567,2569],{"class":632,"line":2555},46,[630,2557,2558],{"class":774},"  enrich",[630,2560,790],{"class":707},[630,2562,2448],{"class":707},[630,2564,2452],{"class":2451},[630,2566,2455],{"class":707},[630,2568,871],{"class":743},[630,2570,874],{"class":707},[630,2572,2574,2577,2579,2581,2584,2587,2590,2592,2595,2597,2599],{"class":632,"line":2573},47,[630,2575,2576],{"class":703},"    for",[630,2578,2448],{"class":786},[630,2580,1979],{"class":743},[630,2582,2583],{"class":711}," enricher",[630,2585,2586],{"class":707}," of",[630,2588,2589],{"class":711}," enrichers",[630,2591,2524],{"class":786},[630,2593,2594],{"class":774},"enricher",[630,2596,777],{"class":786},[630,2598,2452],{"class":711},[630,2600,809],{"class":786},[630,2602,2604,2607,2609,2612,2614,2617,2619,2621,2623,2625,2627],{"class":632,"line":2603},48,[630,2605,2606],{"class":711},"    ctx",[630,2608,896],{"class":707},[630,2610,2611],{"class":711},"event",[630,2613,896],{"class":707},[630,2615,2616],{"class":711},"deploymentId",[630,2618,771],{"class":707},[630,2620,2119],{"class":711},[630,2622,896],{"class":707},[630,2624,1631],{"class":711},[630,2626,896],{"class":707},[630,2628,2629],{"class":711},"VERCEL_DEPLOYMENT_ID\n",[630,2631,2633,2635,2637,2639,2641,2644,2646,2648,2650,2652,2654],{"class":632,"line":2632},49,[630,2634,2606],{"class":711},[630,2636,896],{"class":707},[630,2638,2611],{"class":711},[630,2640,896],{"class":707},[630,2642,2643],{"class":711},"region",[630,2645,771],{"class":707},[630,2647,2119],{"class":711},[630,2649,896],{"class":707},[630,2651,1631],{"class":711},[630,2653,896],{"class":707},[630,2655,2656],{"class":711},"VERCEL_REGION\n",[630,2658,2660],{"class":632,"line":2659},50,[630,2661,1835],{"class":707},[630,2663,2665],{"class":632,"line":2664},51,[630,2666,734],{"emptyLinePlaceholder":733},[630,2668,2670,2672],{"class":632,"line":2669},52,[630,2671,1255],{"class":711},[630,2673,801],{"class":707},[630,2675,2677,2679],{"class":632,"line":2676},53,[630,2678,768],{"class":707},[630,2680,809],{"class":711},[982,2682,2685,2686,2689,2690,2693,2694,2697,2698,2701,2702,2705],{"color":2683,"icon":2684},"neutral","i-lucide-cloud","On Vercel, ",[548,2687,2688],{},"withEvlog"," registers drain work with Next's ",[548,2691,2692],{},"after()",", and with a pipeline it also registers ",[548,2695,2696],{},"drain.settled()",": the function stays alive until the buffered batch is delivered, or dropped once retries are exhausted. ",[548,2699,2700],{},"batch.intervalMs"," bounds when the first delivery attempt starts; retry backoff can extend the lifetime past it. If your ingest endpoint is slow enough to hit the default 5s request timeout, raise it (",[548,2703,2704],{},"createAxiomDrain({ timeout: 15000 })","): a timed-out request that actually landed gets retried, and non-idempotent ingest APIs count that twice.",[608,2707,46],{"id":2708},"wide-events",[544,2710,2711],{},"Build up context progressively through your handler. One request = one wide event:",[620,2713,2716],{"className":693,"code":2714,"filename":2715,"language":696,"meta":626,"style":626},"import { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const POST = withEvlog(async (request: Request) => {\n  const log = useLogger()\n  const body = await request.json()\n\n  \u002F\u002F Stage 1: User context\n  log.set({\n    user: { id: body.userId, plan: 'enterprise' },\n  })\n\n  \u002F\u002F Stage 2: Cart context\n  log.set({\n    cart: { items: body.items.length, total: body.total, currency: 'USD' },\n  })\n\n  \u002F\u002F Stage 3: Payment context\n  const payment = await processPayment(body)\n  log.set({\n    payment: { method: payment.method, cardLast4: payment.last4 },\n  })\n\n  return Response.json({ success: true, orderId: payment.orderId })\n})\n","app\u002Fapi\u002Fcheckout\u002Froute.ts",[548,2717,2718,2740,2744,2777,2789,2809,2813,2818,2830,2867,2873,2877,2882,2894,2950,2956,2960,2965,2986,2998,3035,3041,3045,3084],{"__ignoreMap":626},[630,2719,2720,2722,2724,2726,2728,2730,2732,2734,2736,2738],{"class":632,"line":633},[630,2721,704],{"class":703},[630,2723,708],{"class":707},[630,2725,749],{"class":711},[630,2727,752],{"class":707},[630,2729,755],{"class":711},[630,2731,715],{"class":707},[630,2733,718],{"class":703},[630,2735,721],{"class":707},[630,2737,840],{"class":639},[630,2739,727],{"class":707},[630,2741,2742],{"class":632,"line":730},[630,2743,734],{"emptyLinePlaceholder":733},[630,2745,2746,2748,2750,2753,2755,2757,2759,2761,2763,2766,2768,2771,2773,2775],{"class":632,"line":737},[630,2747,740],{"class":703},[630,2749,744],{"class":743},[630,2751,2752],{"class":711}," POST ",[630,2754,858],{"class":707},[630,2756,749],{"class":774},[630,2758,777],{"class":711},[630,2760,865],{"class":743},[630,2762,2448],{"class":707},[630,2764,2765],{"class":2451},"request",[630,2767,790],{"class":707},[630,2769,2770],{"class":636}," Request",[630,2772,2455],{"class":707},[630,2774,871],{"class":743},[630,2776,874],{"class":707},[630,2778,2779,2781,2783,2785,2787],{"class":632,"line":783},[630,2780,879],{"class":743},[630,2782,760],{"class":711},[630,2784,771],{"class":707},[630,2786,755],{"class":774},[630,2788,888],{"class":786},[630,2790,2791,2793,2796,2798,2800,2803,2805,2807],{"class":632,"line":804},[630,2792,879],{"class":743},[630,2794,2795],{"class":711}," body",[630,2797,771],{"class":707},[630,2799,1371],{"class":703},[630,2801,2802],{"class":711}," request",[630,2804,896],{"class":707},[630,2806,934],{"class":774},[630,2808,888],{"class":786},[630,2810,2811],{"class":632,"line":923},[630,2812,734],{"emptyLinePlaceholder":733},[630,2814,2815],{"class":632,"line":957},[630,2816,2817],{"class":1492},"  \u002F\u002F Stage 1: User context\n",[630,2819,2820,2822,2824,2826,2828],{"class":632,"line":1447},[630,2821,893],{"class":711},[630,2823,896],{"class":707},[630,2825,899],{"class":774},[630,2827,777],{"class":786},[630,2829,780],{"class":707},[630,2831,2832,2835,2837,2839,2842,2844,2846,2848,2851,2853,2856,2858,2860,2863,2865],{"class":632,"line":1455},[630,2833,2834],{"class":786},"    user",[630,2836,790],{"class":707},[630,2838,708],{"class":707},[630,2840,2841],{"class":786}," id",[630,2843,790],{"class":707},[630,2845,2795],{"class":711},[630,2847,896],{"class":707},[630,2849,2850],{"class":711},"userId",[630,2852,752],{"class":707},[630,2854,2855],{"class":786}," plan",[630,2857,790],{"class":707},[630,2859,721],{"class":707},[630,2861,2862],{"class":639},"enterprise",[630,2864,798],{"class":707},[630,2866,2233],{"class":707},[630,2868,2869,2871],{"class":632,"line":1460},[630,2870,1450],{"class":707},[630,2872,809],{"class":786},[630,2874,2875],{"class":632,"line":1467},[630,2876,734],{"emptyLinePlaceholder":733},[630,2878,2879],{"class":632,"line":1479},[630,2880,2881],{"class":1492},"  \u002F\u002F Stage 2: Cart context\n",[630,2883,2884,2886,2888,2890,2892],{"class":632,"line":1489},[630,2885,893],{"class":711},[630,2887,896],{"class":707},[630,2889,899],{"class":774},[630,2891,777],{"class":786},[630,2893,780],{"class":707},[630,2895,2896,2899,2901,2903,2906,2908,2910,2912,2915,2917,2920,2922,2925,2927,2929,2931,2934,2936,2939,2941,2943,2946,2948],{"class":632,"line":1496},[630,2897,2898],{"class":786},"    cart",[630,2900,790],{"class":707},[630,2902,708],{"class":707},[630,2904,2905],{"class":786}," items",[630,2907,790],{"class":707},[630,2909,2795],{"class":711},[630,2911,896],{"class":707},[630,2913,2914],{"class":711},"items",[630,2916,896],{"class":707},[630,2918,2919],{"class":711},"length",[630,2921,752],{"class":707},[630,2923,2924],{"class":786}," total",[630,2926,790],{"class":707},[630,2928,2795],{"class":711},[630,2930,896],{"class":707},[630,2932,2933],{"class":711},"total",[630,2935,752],{"class":707},[630,2937,2938],{"class":786}," currency",[630,2940,790],{"class":707},[630,2942,721],{"class":707},[630,2944,2945],{"class":639},"USD",[630,2947,798],{"class":707},[630,2949,2233],{"class":707},[630,2951,2952,2954],{"class":632,"line":1502},[630,2953,1450],{"class":707},[630,2955,809],{"class":786},[630,2957,2958],{"class":632,"line":1514},[630,2959,734],{"emptyLinePlaceholder":733},[630,2961,2962],{"class":632,"line":1520},[630,2963,2964],{"class":1492},"  \u002F\u002F Stage 3: Payment context\n",[630,2966,2967,2969,2972,2974,2976,2979,2981,2984],{"class":632,"line":2141},[630,2968,879],{"class":743},[630,2970,2971],{"class":711}," payment",[630,2973,771],{"class":707},[630,2975,1371],{"class":703},[630,2977,2978],{"class":774}," processPayment",[630,2980,777],{"class":786},[630,2982,2983],{"class":711},"body",[630,2985,809],{"class":786},[630,2987,2988,2990,2992,2994,2996],{"class":632,"line":2146},[630,2989,893],{"class":711},[630,2991,896],{"class":707},[630,2993,899],{"class":774},[630,2995,777],{"class":786},[630,2997,780],{"class":707},[630,2999,3000,3003,3005,3007,3010,3012,3014,3016,3019,3021,3024,3026,3028,3030,3033],{"class":632,"line":2179},[630,3001,3002],{"class":786},"    payment",[630,3004,790],{"class":707},[630,3006,708],{"class":707},[630,3008,3009],{"class":786}," method",[630,3011,790],{"class":707},[630,3013,2971],{"class":711},[630,3015,896],{"class":707},[630,3017,3018],{"class":711},"method",[630,3020,752],{"class":707},[630,3022,3023],{"class":786}," cardLast4",[630,3025,790],{"class":707},[630,3027,2971],{"class":711},[630,3029,896],{"class":707},[630,3031,3032],{"class":711},"last4",[630,3034,2233],{"class":707},[630,3036,3037,3039],{"class":632,"line":2194},[630,3038,1450],{"class":707},[630,3040,809],{"class":786},[630,3042,3043],{"class":632,"line":2199},[630,3044,734],{"emptyLinePlaceholder":733},[630,3046,3047,3049,3051,3053,3055,3057,3059,3062,3064,3066,3068,3071,3073,3075,3077,3080,3082],{"class":632,"line":2205},[630,3048,926],{"class":703},[630,3050,929],{"class":711},[630,3052,896],{"class":707},[630,3054,934],{"class":774},[630,3056,777],{"class":786},[630,3058,904],{"class":707},[630,3060,3061],{"class":786}," success",[630,3063,790],{"class":707},[630,3065,1150],{"class":1149},[630,3067,752],{"class":707},[630,3069,3070],{"class":786}," orderId",[630,3072,790],{"class":707},[630,3074,2971],{"class":711},[630,3076,896],{"class":707},[630,3078,3079],{"class":711},"orderId",[630,3081,715],{"class":707},[630,3083,809],{"class":786},[630,3085,3086,3088],{"class":632,"line":2215},[630,3087,768],{"class":707},[630,3089,809],{"class":711},[544,3091,3092],{},"All fields are merged into a single wide event emitted when the handler completes (or when a streaming response body finishes, so AI SDK metadata is included):",[620,3094,3097],{"className":622,"code":3095,"filename":3096,"language":625,"meta":626,"style":626},"10:23:45.612 INFO [my-app] POST \u002Fapi\u002Fcheckout 200 in 145ms\n  ├─ user: id=usr_123 plan=enterprise\n  ├─ cart: items=3 total=14999 currency=USD\n  ├─ payment: method=card cardLast4=4242\n  └─ requestId: a1b2c3d4-...\n","Output (Pretty)",[548,3098,3099,3110,3124,3146,3162],{"__ignoreMap":626},[630,3100,3101,3104,3107],{"class":632,"line":633},[630,3102,3103],{"class":636},"10:23:45.612",[630,3105,3106],{"class":639}," INFO",[630,3108,3109],{"class":711}," [my-app] POST \u002Fapi\u002Fcheckout 200 in 145ms\n",[630,3111,3112,3115,3118,3121],{"class":632,"line":730},[630,3113,3114],{"class":636},"  ├─",[630,3116,3117],{"class":639}," user:",[630,3119,3120],{"class":639}," id=usr_123",[630,3122,3123],{"class":639}," plan=enterprise\n",[630,3125,3126,3128,3131,3134,3137,3140,3143],{"class":632,"line":737},[630,3127,3114],{"class":636},[630,3129,3130],{"class":639}," cart:",[630,3132,3133],{"class":639}," items=",[630,3135,3136],{"class":2046},"3",[630,3138,3139],{"class":639}," total=",[630,3141,3142],{"class":2046},"14999",[630,3144,3145],{"class":639}," currency=USD\n",[630,3147,3148,3150,3153,3156,3159],{"class":632,"line":783},[630,3149,3114],{"class":636},[630,3151,3152],{"class":639}," payment:",[630,3154,3155],{"class":639}," method=card",[630,3157,3158],{"class":639}," cardLast4=",[630,3160,3161],{"class":2046},"4242\n",[630,3163,3164,3167,3170],{"class":632,"line":804},[630,3165,3166],{"class":636},"  └─",[630,3168,3169],{"class":639}," requestId:",[630,3171,3172],{"class":639}," a1b2c3d4-...\n",[608,3174,3176,3177,2455],{"id":3175},"background-work-logfork","Background work (",[548,3178,3179],{},"log.fork",[544,3181,3182,3183,1566,3185,3187,3188,3193,3194,3198],{},"Inside ",[548,3184,2688],{},[548,3186,558],{}," returns a logger with ",[993,3189,3190],{},[548,3191,3192],{},"fork"," for child wide events. See ",[597,3195,3197],{"href":3196},"\u002Flearn\u002Fwide-events#after-emit-sealing-and-background-work","After emit"," in Wide events.",[620,3200,3203],{"className":693,"code":3201,"filename":3202,"language":696,"meta":626,"style":626},"import { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const POST = withEvlog(async () => {\n  const log = useLogger()\n  log.fork!('enqueue', async () => {\n    const child = useLogger()\n    child.set({ job: 'queued' })\n  })\n  return Response.json({ ok: true })\n})\n","app\u002Fapi\u002Forders\u002Froute.ts",[548,3204,3205,3227,3231,3253,3265,3296,3309,3338,3344,3369],{"__ignoreMap":626},[630,3206,3207,3209,3211,3213,3215,3217,3219,3221,3223,3225],{"class":632,"line":633},[630,3208,704],{"class":703},[630,3210,708],{"class":707},[630,3212,749],{"class":711},[630,3214,752],{"class":707},[630,3216,755],{"class":711},[630,3218,715],{"class":707},[630,3220,718],{"class":703},[630,3222,721],{"class":707},[630,3224,840],{"class":639},[630,3226,727],{"class":707},[630,3228,3229],{"class":632,"line":730},[630,3230,734],{"emptyLinePlaceholder":733},[630,3232,3233,3235,3237,3239,3241,3243,3245,3247,3249,3251],{"class":632,"line":737},[630,3234,740],{"class":703},[630,3236,744],{"class":743},[630,3238,2752],{"class":711},[630,3240,858],{"class":707},[630,3242,749],{"class":774},[630,3244,777],{"class":711},[630,3246,865],{"class":743},[630,3248,868],{"class":707},[630,3250,871],{"class":743},[630,3252,874],{"class":707},[630,3254,3255,3257,3259,3261,3263],{"class":632,"line":783},[630,3256,879],{"class":743},[630,3258,760],{"class":711},[630,3260,771],{"class":707},[630,3262,755],{"class":774},[630,3264,888],{"class":786},[630,3266,3267,3269,3271,3273,3276,3278,3280,3283,3285,3287,3290,3292,3294],{"class":632,"line":804},[630,3268,893],{"class":711},[630,3270,896],{"class":707},[630,3272,3192],{"class":774},[630,3274,3275],{"class":707},"!",[630,3277,777],{"class":786},[630,3279,798],{"class":707},[630,3281,3282],{"class":639},"enqueue",[630,3284,798],{"class":707},[630,3286,752],{"class":707},[630,3288,3289],{"class":743}," async",[630,3291,868],{"class":707},[630,3293,871],{"class":743},[630,3295,874],{"class":707},[630,3297,3298,3300,3303,3305,3307],{"class":632,"line":923},[630,3299,2465],{"class":743},[630,3301,3302],{"class":711}," child",[630,3304,771],{"class":707},[630,3306,755],{"class":774},[630,3308,888],{"class":786},[630,3310,3311,3314,3316,3318,3320,3322,3325,3327,3329,3332,3334,3336],{"class":632,"line":957},[630,3312,3313],{"class":711},"    child",[630,3315,896],{"class":707},[630,3317,899],{"class":774},[630,3319,777],{"class":786},[630,3321,904],{"class":707},[630,3323,3324],{"class":786}," job",[630,3326,790],{"class":707},[630,3328,721],{"class":707},[630,3330,3331],{"class":639},"queued",[630,3333,798],{"class":707},[630,3335,715],{"class":707},[630,3337,809],{"class":786},[630,3339,3340,3342],{"class":632,"line":1447},[630,3341,1450],{"class":707},[630,3343,809],{"class":786},[630,3345,3346,3348,3350,3352,3354,3356,3358,3361,3363,3365,3367],{"class":632,"line":1455},[630,3347,926],{"class":703},[630,3349,929],{"class":711},[630,3351,896],{"class":707},[630,3353,934],{"class":774},[630,3355,777],{"class":786},[630,3357,904],{"class":707},[630,3359,3360],{"class":786}," ok",[630,3362,790],{"class":707},[630,3364,1150],{"class":1149},[630,3366,715],{"class":707},[630,3368,809],{"class":786},[630,3370,3371,3373],{"class":632,"line":1460},[630,3372,768],{"class":707},[630,3374,809],{"class":711},[608,3376,3378],{"id":3377},"error-handling","Error Handling",[544,3380,3381,3382,3385,3386,1566,3389,3392,3393,3396],{},"Use ",[548,3383,3384],{},"createError"," for structured errors with ",[548,3387,3388],{},"why",[548,3390,3391],{},"fix",", and ",[548,3394,3395],{},"link"," fields that help developers debug in both logs and API responses:",[1853,3398,3399],{},[620,3400,3403],{"className":693,"code":3401,"filename":3402,"language":696,"meta":626,"style":626},"import { withEvlog, useLogger, createError } from '@\u002Flib\u002Fevlog'\n\nexport const POST = withEvlog(async (request: Request) => {\n  const log = useLogger()\n  const body = await request.json()\n\n  log.set({ payment: { amount: body.amount } })\n\n  if (body.amount \u003C= 0) {\n    throw createError({\n      status: 400,\n      message: 'Invalid payment amount',\n      why: 'The amount must be a positive number',\n      fix: 'Pass a positive integer in cents (e.g. 4999 for $49.99)',\n      link: 'https:\u002F\u002Fdocs.example.com\u002Fapi\u002Fpayments#amount',\n    })\n  }\n\n  const result = await chargeCard(body)\n\n  if (!result.success) {\n    log.error(new Error(`Payment declined: ${result.reason}`))\n    throw createError({\n      status: 402,\n      message: 'Payment declined',\n      why: `Card declined by issuer: ${result.reason}`,\n      fix: 'Try a different payment method or contact your bank',\n    })\n  }\n\n  return Response.json({ success: true })\n})\n","app\u002Fapi\u002Fpayment\u002Fprocess\u002Froute.ts",[548,3404,3405,3432,3436,3466,3478,3496,3500,3536,3540,3563,3574,3585,3601,3617,3633,3649,3656,3660,3664,3684,3688,3708,3749,3759,3770,3785,3809,3824,3830,3834,3838,3862],{"__ignoreMap":626},[630,3406,3407,3409,3411,3413,3415,3417,3419,3422,3424,3426,3428,3430],{"class":632,"line":633},[630,3408,704],{"class":703},[630,3410,708],{"class":707},[630,3412,749],{"class":711},[630,3414,752],{"class":707},[630,3416,755],{"class":711},[630,3418,752],{"class":707},[630,3420,3421],{"class":711}," createError",[630,3423,715],{"class":707},[630,3425,718],{"class":703},[630,3427,721],{"class":707},[630,3429,840],{"class":639},[630,3431,727],{"class":707},[630,3433,3434],{"class":632,"line":730},[630,3435,734],{"emptyLinePlaceholder":733},[630,3437,3438,3440,3442,3444,3446,3448,3450,3452,3454,3456,3458,3460,3462,3464],{"class":632,"line":737},[630,3439,740],{"class":703},[630,3441,744],{"class":743},[630,3443,2752],{"class":711},[630,3445,858],{"class":707},[630,3447,749],{"class":774},[630,3449,777],{"class":711},[630,3451,865],{"class":743},[630,3453,2448],{"class":707},[630,3455,2765],{"class":2451},[630,3457,790],{"class":707},[630,3459,2770],{"class":636},[630,3461,2455],{"class":707},[630,3463,871],{"class":743},[630,3465,874],{"class":707},[630,3467,3468,3470,3472,3474,3476],{"class":632,"line":783},[630,3469,879],{"class":743},[630,3471,760],{"class":711},[630,3473,771],{"class":707},[630,3475,755],{"class":774},[630,3477,888],{"class":786},[630,3479,3480,3482,3484,3486,3488,3490,3492,3494],{"class":632,"line":804},[630,3481,879],{"class":743},[630,3483,2795],{"class":711},[630,3485,771],{"class":707},[630,3487,1371],{"class":703},[630,3489,2802],{"class":711},[630,3491,896],{"class":707},[630,3493,934],{"class":774},[630,3495,888],{"class":786},[630,3497,3498],{"class":632,"line":923},[630,3499,734],{"emptyLinePlaceholder":733},[630,3501,3502,3504,3506,3508,3510,3512,3514,3516,3518,3521,3523,3525,3527,3530,3532,3534],{"class":632,"line":957},[630,3503,893],{"class":711},[630,3505,896],{"class":707},[630,3507,899],{"class":774},[630,3509,777],{"class":786},[630,3511,904],{"class":707},[630,3513,2971],{"class":786},[630,3515,790],{"class":707},[630,3517,708],{"class":707},[630,3519,3520],{"class":786}," amount",[630,3522,790],{"class":707},[630,3524,2795],{"class":711},[630,3526,896],{"class":707},[630,3528,3529],{"class":711},"amount",[630,3531,715],{"class":707},[630,3533,715],{"class":707},[630,3535,809],{"class":786},[630,3537,3538],{"class":632,"line":1447},[630,3539,734],{"emptyLinePlaceholder":733},[630,3541,3542,3545,3547,3549,3551,3553,3556,3559,3561],{"class":632,"line":1455},[630,3543,3544],{"class":703},"  if",[630,3546,2448],{"class":786},[630,3548,2983],{"class":711},[630,3550,896],{"class":707},[630,3552,3529],{"class":711},[630,3554,3555],{"class":707}," \u003C=",[630,3557,3558],{"class":2046}," 0",[630,3560,2524],{"class":786},[630,3562,780],{"class":707},[630,3564,3565,3568,3570,3572],{"class":632,"line":1460},[630,3566,3567],{"class":703},"    throw",[630,3569,3421],{"class":774},[630,3571,777],{"class":786},[630,3573,780],{"class":707},[630,3575,3576,3579,3581,3583],{"class":632,"line":1467},[630,3577,3578],{"class":786},"      status",[630,3580,790],{"class":707},[630,3582,2258],{"class":2046},[630,3584,801],{"class":707},[630,3586,3587,3590,3592,3594,3597,3599],{"class":632,"line":1479},[630,3588,3589],{"class":786},"      message",[630,3591,790],{"class":707},[630,3593,721],{"class":707},[630,3595,3596],{"class":639},"Invalid payment amount",[630,3598,798],{"class":707},[630,3600,801],{"class":707},[630,3602,3603,3606,3608,3610,3613,3615],{"class":632,"line":1489},[630,3604,3605],{"class":786},"      why",[630,3607,790],{"class":707},[630,3609,721],{"class":707},[630,3611,3612],{"class":639},"The amount must be a positive number",[630,3614,798],{"class":707},[630,3616,801],{"class":707},[630,3618,3619,3622,3624,3626,3629,3631],{"class":632,"line":1496},[630,3620,3621],{"class":786},"      fix",[630,3623,790],{"class":707},[630,3625,721],{"class":707},[630,3627,3628],{"class":639},"Pass a positive integer in cents (e.g. 4999 for $49.99)",[630,3630,798],{"class":707},[630,3632,801],{"class":707},[630,3634,3635,3638,3640,3642,3645,3647],{"class":632,"line":1502},[630,3636,3637],{"class":786},"      link",[630,3639,790],{"class":707},[630,3641,721],{"class":707},[630,3643,3644],{"class":639},"https:\u002F\u002Fdocs.example.com\u002Fapi\u002Fpayments#amount",[630,3646,798],{"class":707},[630,3648,801],{"class":707},[630,3650,3651,3654],{"class":632,"line":1514},[630,3652,3653],{"class":707},"    }",[630,3655,809],{"class":786},[630,3657,3658],{"class":632,"line":1520},[630,3659,1517],{"class":707},[630,3661,3662],{"class":632,"line":2141},[630,3663,734],{"emptyLinePlaceholder":733},[630,3665,3666,3668,3671,3673,3675,3678,3680,3682],{"class":632,"line":2146},[630,3667,879],{"class":743},[630,3669,3670],{"class":711}," result",[630,3672,771],{"class":707},[630,3674,1371],{"class":703},[630,3676,3677],{"class":774}," chargeCard",[630,3679,777],{"class":786},[630,3681,2983],{"class":711},[630,3683,809],{"class":786},[630,3685,3686],{"class":632,"line":2179},[630,3687,734],{"emptyLinePlaceholder":733},[630,3689,3690,3692,3694,3696,3699,3701,3704,3706],{"class":632,"line":2194},[630,3691,3544],{"class":703},[630,3693,2448],{"class":786},[630,3695,3275],{"class":707},[630,3697,3698],{"class":711},"result",[630,3700,896],{"class":707},[630,3702,3703],{"class":711},"success",[630,3705,2524],{"class":786},[630,3707,780],{"class":707},[630,3709,3710,3713,3715,3718,3720,3723,3726,3728,3731,3734,3737,3739,3741,3744,3747],{"class":632,"line":2199},[630,3711,3712],{"class":711},"    log",[630,3714,896],{"class":707},[630,3716,3717],{"class":774},"error",[630,3719,777],{"class":786},[630,3721,3722],{"class":707},"new",[630,3724,3725],{"class":774}," Error",[630,3727,777],{"class":786},[630,3729,3730],{"class":707},"`",[630,3732,3733],{"class":639},"Payment declined: ",[630,3735,3736],{"class":707},"${",[630,3738,3698],{"class":711},[630,3740,896],{"class":707},[630,3742,3743],{"class":711},"reason",[630,3745,3746],{"class":707},"}`",[630,3748,2138],{"class":786},[630,3750,3751,3753,3755,3757],{"class":632,"line":2205},[630,3752,3567],{"class":703},[630,3754,3421],{"class":774},[630,3756,777],{"class":786},[630,3758,780],{"class":707},[630,3760,3761,3763,3765,3768],{"class":632,"line":2215},[630,3762,3578],{"class":786},[630,3764,790],{"class":707},[630,3766,3767],{"class":2046}," 402",[630,3769,801],{"class":707},[630,3771,3772,3774,3776,3778,3781,3783],{"class":632,"line":2236},[630,3773,3589],{"class":786},[630,3775,790],{"class":707},[630,3777,721],{"class":707},[630,3779,3780],{"class":639},"Payment declined",[630,3782,798],{"class":707},[630,3784,801],{"class":707},[630,3786,3787,3789,3791,3794,3797,3799,3801,3803,3805,3807],{"class":632,"line":2247},[630,3788,3605],{"class":786},[630,3790,790],{"class":707},[630,3792,3793],{"class":707}," `",[630,3795,3796],{"class":639},"Card declined by issuer: ",[630,3798,3736],{"class":707},[630,3800,3698],{"class":711},[630,3802,896],{"class":707},[630,3804,3743],{"class":711},[630,3806,3746],{"class":707},[630,3808,801],{"class":707},[630,3810,3811,3813,3815,3817,3820,3822],{"class":632,"line":2267},[630,3812,3621],{"class":786},[630,3814,790],{"class":707},[630,3816,721],{"class":707},[630,3818,3819],{"class":639},"Try a different payment method or contact your bank",[630,3821,798],{"class":707},[630,3823,801],{"class":707},[630,3825,3826,3828],{"class":632,"line":2285},[630,3827,3653],{"class":707},[630,3829,809],{"class":786},[630,3831,3832],{"class":632,"line":2307},[630,3833,1517],{"class":707},[630,3835,3836],{"class":632,"line":2315},[630,3837,734],{"emptyLinePlaceholder":733},[630,3839,3840,3842,3844,3846,3848,3850,3852,3854,3856,3858,3860],{"class":632,"line":2320},[630,3841,926],{"class":703},[630,3843,929],{"class":711},[630,3845,896],{"class":707},[630,3847,934],{"class":774},[630,3849,777],{"class":786},[630,3851,904],{"class":707},[630,3853,3061],{"class":786},[630,3855,790],{"class":707},[630,3857,1150],{"class":1149},[630,3859,715],{"class":707},[630,3861,809],{"class":786},[630,3863,3864,3866],{"class":632,"line":2325},[630,3865,768],{"class":707},[630,3867,809],{"class":711},[544,3869,3870,3872,3873,3876],{},[548,3871,554],{}," catches ",[548,3874,3875],{},"EvlogError"," and returns a structured JSON response (like Nitro does for Nuxt):",[620,3878,3882],{"className":3879,"code":3880,"filename":3881,"language":934,"meta":626,"style":626},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"name\": \"EvlogError\",\n  \"message\": \"Payment declined\",\n  \"status\": 402,\n  \"data\": {\n    \"why\": \"Card declined by issuer: insufficient_funds\",\n    \"fix\": \"Try a different payment method or contact your bank\"\n  }\n}\n","Response (402)",[548,3883,3884,3888,3910,3929,3944,3957,3977,3994,3998],{"__ignoreMap":626},[630,3885,3886],{"class":632,"line":633},[630,3887,780],{"class":707},[630,3889,3890,3893,3896,3899,3901,3904,3906,3908],{"class":632,"line":730},[630,3891,3892],{"class":707},"  \"",[630,3894,3895],{"class":743},"name",[630,3897,3898],{"class":707},"\"",[630,3900,790],{"class":707},[630,3902,3903],{"class":707}," \"",[630,3905,3875],{"class":639},[630,3907,3898],{"class":707},[630,3909,801],{"class":707},[630,3911,3912,3914,3917,3919,3921,3923,3925,3927],{"class":632,"line":737},[630,3913,3892],{"class":707},[630,3915,3916],{"class":743},"message",[630,3918,3898],{"class":707},[630,3920,790],{"class":707},[630,3922,3903],{"class":707},[630,3924,3780],{"class":639},[630,3926,3898],{"class":707},[630,3928,801],{"class":707},[630,3930,3931,3933,3936,3938,3940,3942],{"class":632,"line":783},[630,3932,3892],{"class":707},[630,3934,3935],{"class":743},"status",[630,3937,3898],{"class":707},[630,3939,790],{"class":707},[630,3941,3767],{"class":2046},[630,3943,801],{"class":707},[630,3945,3946,3948,3951,3953,3955],{"class":632,"line":804},[630,3947,3892],{"class":707},[630,3949,3950],{"class":743},"data",[630,3952,3898],{"class":707},[630,3954,790],{"class":707},[630,3956,874],{"class":707},[630,3958,3959,3962,3964,3966,3968,3970,3973,3975],{"class":632,"line":923},[630,3960,3961],{"class":707},"    \"",[630,3963,3388],{"class":636},[630,3965,3898],{"class":707},[630,3967,790],{"class":707},[630,3969,3903],{"class":707},[630,3971,3972],{"class":639},"Card declined by issuer: insufficient_funds",[630,3974,3898],{"class":707},[630,3976,801],{"class":707},[630,3978,3979,3981,3983,3985,3987,3989,3991],{"class":632,"line":957},[630,3980,3961],{"class":707},[630,3982,3391],{"class":636},[630,3984,3898],{"class":707},[630,3986,790],{"class":707},[630,3988,3903],{"class":707},[630,3990,3819],{"class":639},[630,3992,3993],{"class":707},"\"\n",[630,3995,3996],{"class":632,"line":1447},[630,3997,1517],{"class":707},[630,3999,4000],{"class":632,"line":1455},[630,4001,4002],{"class":707},"}\n",[544,4004,4005],{},"In the terminal, the error renders inside the wide event: error block first, then request context. Colors and tree connectors render in the terminal; the example below omits ANSI for readability.",[620,4007,4010],{"className":622,"code":4008,"filename":4009,"language":625,"meta":626,"style":626},"ERROR [app] POST \u002Fapi\u002Fpayment\u002Fprocess 402 in 12ms\n  ├─ error: Payment declined\n  │     at app\u002Fapi\u002Fpayment\u002Fprocess\u002Froute.ts:336\n  │   ❯ 336 ┃ throw createError({ message: 'Payment declined', ... })\n  │     Why: Card declined by issuer: insufficient_funds\n  │     Fix: Try a different payment method or contact your bank\n  │     stack (3 frames hidden in node_modules)\n  └─ payment: amount=4999\n","Terminal output",[548,4011,4012,4020,4033,4044,4067,4089,4121,4145],{"__ignoreMap":626},[630,4013,4014,4017],{"class":632,"line":633},[630,4015,4016],{"class":636},"ERROR",[630,4018,4019],{"class":711}," [app] POST \u002Fapi\u002Fpayment\u002Fprocess 402 in 12ms\n",[630,4021,4022,4024,4027,4030],{"class":632,"line":730},[630,4023,3114],{"class":636},[630,4025,4026],{"class":639}," error:",[630,4028,4029],{"class":639}," Payment",[630,4031,4032],{"class":639}," declined\n",[630,4034,4035,4038,4041],{"class":632,"line":737},[630,4036,4037],{"class":636},"  │",[630,4039,4040],{"class":639},"     at",[630,4042,4043],{"class":639}," app\u002Fapi\u002Fpayment\u002Fprocess\u002Froute.ts:336\n",[630,4045,4046,4048,4051,4054,4057,4060,4062,4064],{"class":632,"line":783},[630,4047,4037],{"class":636},[630,4049,4050],{"class":639},"   ❯",[630,4052,4053],{"class":2046}," 336",[630,4055,4056],{"class":639}," ┃",[630,4058,4059],{"class":639}," throw",[630,4061,3421],{"class":639},[630,4063,777],{"class":707},[630,4065,4066],{"class":711},"{ message: 'Payment declined', ... })\n",[630,4068,4069,4071,4074,4077,4080,4083,4086],{"class":632,"line":804},[630,4070,4037],{"class":636},[630,4072,4073],{"class":639},"     Why:",[630,4075,4076],{"class":639}," Card",[630,4078,4079],{"class":639}," declined",[630,4081,4082],{"class":639}," by",[630,4084,4085],{"class":639}," issuer:",[630,4087,4088],{"class":639}," insufficient_funds\n",[630,4090,4091,4093,4096,4099,4102,4105,4107,4109,4112,4115,4118],{"class":632,"line":923},[630,4092,4037],{"class":636},[630,4094,4095],{"class":639},"     Fix:",[630,4097,4098],{"class":639}," Try",[630,4100,4101],{"class":639}," a",[630,4103,4104],{"class":639}," different",[630,4106,2971],{"class":639},[630,4108,3009],{"class":639},[630,4110,4111],{"class":639}," or",[630,4113,4114],{"class":639}," contact",[630,4116,4117],{"class":639}," your",[630,4119,4120],{"class":639}," bank\n",[630,4122,4123,4125,4128,4131,4134,4137,4140,4143],{"class":632,"line":957},[630,4124,4037],{"class":636},[630,4126,4127],{"class":639},"     stack",[630,4129,4130],{"class":711}," (3 ",[630,4132,4133],{"class":639},"frames",[630,4135,4136],{"class":639}," hidden",[630,4138,4139],{"class":639}," in",[630,4141,4142],{"class":639}," node_modules",[630,4144,809],{"class":707},[630,4146,4147,4149,4151,4154],{"class":632,"line":1447},[630,4148,3166],{"class":636},[630,4150,3152],{"class":639},[630,4152,4153],{"class":639}," amount=",[630,4155,4156],{"class":2046},"4999\n",[612,4158,4160],{"id":4159},"parsing-errors-on-the-client","Parsing Errors on the Client",[544,4162,3381,4163,4166,4167,4169,4170,4173],{},[548,4164,4165],{},"parseError"," to extract the structured fields from any error, whether it's a fetch response, an ",[548,4168,3875],{},", or a plain ",[548,4171,4172],{},"Error"," object:",[620,4175,4180],{"className":4176,"code":4177,"filename":4178,"language":4179,"meta":626,"style":626},"language-tsx shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","'use client'\nimport { parseError } from 'evlog'\n\nasync function handleSubmit(formData: FormData) {\n  try {\n    const res = await fetch('\u002Fapi\u002Fpayment\u002Fprocess', {\n      method: 'POST',\n      body: JSON.stringify({ amount: Number(formData.get('amount')) }),\n    })\n    if (!res.ok) throw { data: await res.json(), status: res.status }\n  } catch (error) {\n    const { message, status, why, fix, link } = parseError(error)\n    \u002F\u002F message: \"Payment declined\"\n    \u002F\u002F why: \"Card declined by issuer: insufficient_funds\"\n    \u002F\u002F fix: \"Try a different payment method or contact your bank\"\n  }\n}\n","app\u002Fcomponents\u002FPaymentForm.tsx","tsx",[548,4181,4182,4191,4210,4214,4238,4245,4272,4288,4339,4345,4398,4413,4452,4457,4462,4467,4471],{"__ignoreMap":626},[630,4183,4184,4186,4189],{"class":632,"line":633},[630,4185,798],{"class":707},[630,4187,4188],{"class":639},"use client",[630,4190,727],{"class":707},[630,4192,4193,4195,4197,4200,4202,4204,4206,4208],{"class":632,"line":730},[630,4194,704],{"class":703},[630,4196,708],{"class":707},[630,4198,4199],{"class":711}," parseError",[630,4201,715],{"class":707},[630,4203,718],{"class":703},[630,4205,721],{"class":707},[630,4207,1880],{"class":639},[630,4209,727],{"class":707},[630,4211,4212],{"class":632,"line":737},[630,4213,734],{"emptyLinePlaceholder":733},[630,4215,4216,4218,4221,4224,4226,4229,4231,4234,4236],{"class":632,"line":783},[630,4217,865],{"class":743},[630,4219,4220],{"class":743}," function",[630,4222,4223],{"class":774}," handleSubmit",[630,4225,777],{"class":707},[630,4227,4228],{"class":2451},"formData",[630,4230,790],{"class":707},[630,4232,4233],{"class":636}," FormData",[630,4235,2455],{"class":707},[630,4237,874],{"class":707},[630,4239,4240,4243],{"class":632,"line":804},[630,4241,4242],{"class":703},"  try",[630,4244,874],{"class":707},[630,4246,4247,4249,4252,4254,4256,4259,4261,4263,4266,4268,4270],{"class":632,"line":923},[630,4248,2465],{"class":743},[630,4250,4251],{"class":711}," res",[630,4253,771],{"class":707},[630,4255,1371],{"class":703},[630,4257,4258],{"class":774}," fetch",[630,4260,777],{"class":786},[630,4262,798],{"class":707},[630,4264,4265],{"class":639},"\u002Fapi\u002Fpayment\u002Fprocess",[630,4267,798],{"class":707},[630,4269,752],{"class":707},[630,4271,874],{"class":707},[630,4273,4274,4277,4279,4281,4284,4286],{"class":632,"line":957},[630,4275,4276],{"class":786},"      method",[630,4278,790],{"class":707},[630,4280,721],{"class":707},[630,4282,4283],{"class":639},"POST",[630,4285,798],{"class":707},[630,4287,801],{"class":707},[630,4289,4290,4293,4295,4298,4300,4302,4304,4306,4308,4310,4313,4315,4317,4319,4322,4324,4326,4328,4330,4333,4335,4337],{"class":632,"line":1447},[630,4291,4292],{"class":786},"      body",[630,4294,790],{"class":707},[630,4296,4297],{"class":711}," JSON",[630,4299,896],{"class":707},[630,4301,1642],{"class":774},[630,4303,777],{"class":786},[630,4305,904],{"class":707},[630,4307,3520],{"class":786},[630,4309,790],{"class":707},[630,4311,4312],{"class":774}," Number",[630,4314,777],{"class":786},[630,4316,4228],{"class":711},[630,4318,896],{"class":707},[630,4320,4321],{"class":774},"get",[630,4323,777],{"class":786},[630,4325,798],{"class":707},[630,4327,3529],{"class":639},[630,4329,798],{"class":707},[630,4331,4332],{"class":786},")) ",[630,4334,768],{"class":707},[630,4336,2455],{"class":786},[630,4338,801],{"class":707},[630,4340,4341,4343],{"class":632,"line":1455},[630,4342,3653],{"class":707},[630,4344,809],{"class":786},[630,4346,4347,4349,4351,4353,4356,4358,4361,4363,4366,4368,4371,4373,4375,4377,4379,4381,4383,4385,4387,4389,4391,4393,4395],{"class":632,"line":1460},[630,4348,2511],{"class":703},[630,4350,2448],{"class":786},[630,4352,3275],{"class":707},[630,4354,4355],{"class":711},"res",[630,4357,896],{"class":707},[630,4359,4360],{"class":711},"ok",[630,4362,2524],{"class":786},[630,4364,4365],{"class":703},"throw",[630,4367,708],{"class":707},[630,4369,4370],{"class":786}," data",[630,4372,790],{"class":707},[630,4374,1371],{"class":703},[630,4376,4251],{"class":711},[630,4378,896],{"class":707},[630,4380,934],{"class":774},[630,4382,1262],{"class":786},[630,4384,752],{"class":707},[630,4386,2253],{"class":786},[630,4388,790],{"class":707},[630,4390,4251],{"class":711},[630,4392,896],{"class":707},[630,4394,3935],{"class":711},[630,4396,4397],{"class":707}," }\n",[630,4399,4400,4402,4405,4407,4409,4411],{"class":632,"line":1467},[630,4401,1450],{"class":707},[630,4403,4404],{"class":703}," catch",[630,4406,2448],{"class":786},[630,4408,3717],{"class":711},[630,4410,2524],{"class":786},[630,4412,780],{"class":707},[630,4414,4415,4417,4419,4421,4423,4425,4427,4430,4432,4435,4437,4440,4442,4444,4446,4448,4450],{"class":632,"line":1479},[630,4416,2465],{"class":743},[630,4418,708],{"class":707},[630,4420,941],{"class":711},[630,4422,752],{"class":707},[630,4424,2253],{"class":711},[630,4426,752],{"class":707},[630,4428,4429],{"class":711}," why",[630,4431,752],{"class":707},[630,4433,4434],{"class":711}," fix",[630,4436,752],{"class":707},[630,4438,4439],{"class":711}," link",[630,4441,715],{"class":707},[630,4443,771],{"class":707},[630,4445,4199],{"class":774},[630,4447,777],{"class":786},[630,4449,3717],{"class":711},[630,4451,809],{"class":786},[630,4453,4454],{"class":632,"line":1489},[630,4455,4456],{"class":1492},"    \u002F\u002F message: \"Payment declined\"\n",[630,4458,4459],{"class":632,"line":1496},[630,4460,4461],{"class":1492},"    \u002F\u002F why: \"Card declined by issuer: insufficient_funds\"\n",[630,4463,4464],{"class":632,"line":1502},[630,4465,4466],{"class":1492},"    \u002F\u002F fix: \"Try a different payment method or contact your bank\"\n",[630,4468,4469],{"class":632,"line":1514},[630,4470,1517],{"class":707},[630,4472,4473],{"class":632,"line":1520},[630,4474,4002],{"class":707},[544,4476,4477,4479,4480,4483,4484,4487],{},[548,4478,4165],{}," normalizes any error shape into a flat ",[548,4481,4482],{},"{ message, status, why?, fix?, link? }"," object, so your UI code never has to dig through nested ",[548,4485,4486],{},"data.data"," or check for different error formats.",[608,4489,508],{"id":4490},"configuration-1",[982,4492,4493,4494,4497,4498,1566,4500,1566,4502,1566,4504,4506],{"color":984,"icon":79},"See the ",[597,4495,4496],{"href":509},"Configuration reference"," for the full list of shared options (",[548,4499,1625],{},[548,4501,1634],{},[548,4503,1602],{},[548,4505,1639],{},", middleware options, etc.).",[544,4508,4509,4510,4512],{},"The ",[548,4511,550],{}," factory accepts the following options:",[1647,4514,4515,4527],{},[1650,4516,4517],{},[1653,4518,4519,4521,4523,4525],{},[1656,4520,1658],{},[1656,4522,1661],{},[1656,4524,1664],{},[1656,4526,1667],{},[1669,4528,4529,4548,4565,4585,4603,4622,4641,4660,4679,4697],{},[1653,4530,4531,4535,4540,4545],{},[1674,4532,4533],{},[548,4534,1628],{},[1674,4536,4537],{},[548,4538,4539],{},"string",[1674,4541,4542],{},[548,4543,4544],{},"'app'",[1674,4546,4547],{},"Service name shown in logs",[1653,4549,4550,4555,4559,4562],{},[1674,4551,4552],{},[548,4553,4554],{},"environment",[1674,4556,4557],{},[548,4558,4539],{},[1674,4560,4561],{},"Auto-detected",[1674,4563,4564],{},"Environment name",[1653,4566,4567,4572,4577,4582],{},[1674,4568,4569],{},[548,4570,4571],{},"include",[1674,4573,4574],{},[548,4575,4576],{},"string[]",[1674,4578,4579],{},[548,4580,4581],{},"undefined",[1674,4583,4584],{},"Route patterns to log",[1653,4586,4587,4592,4596,4600],{},[1674,4588,4589],{},[548,4590,4591],{},"exclude",[1674,4593,4594],{},[548,4595,4576],{},[1674,4597,4598],{},[548,4599,4581],{},[1674,4601,4602],{},"Route patterns to exclude",[1653,4604,4605,4610,4615,4619],{},[1674,4606,4607],{},[548,4608,4609],{},"routes",[1674,4611,4612],{},[548,4613,4614],{},"Record\u003Cstring, RouteConfig>",[1674,4616,4617],{},[548,4618,4581],{},[1674,4620,4621],{},"Route-specific service configuration",[1653,4623,4624,4629,4634,4638],{},[1674,4625,4626],{},[548,4627,4628],{},"sampling.rates",[1674,4630,4631],{},[548,4632,4633],{},"object",[1674,4635,4636],{},[548,4637,4581],{},[1674,4639,4640],{},"Head sampling rates per log level",[1653,4642,4643,4648,4653,4657],{},[1674,4644,4645],{},[548,4646,4647],{},"sampling.keep",[1674,4649,4650],{},[548,4651,4652],{},"array",[1674,4654,4655],{},[548,4656,4581],{},[1674,4658,4659],{},"Tail sampling conditions",[1653,4661,4662,4667,4672,4676],{},[1674,4663,4664],{},[548,4665,4666],{},"keep",[1674,4668,4669],{},[548,4670,4671],{},"(ctx: TailSamplingContext) => void",[1674,4673,4674],{},[548,4675,4581],{},[1674,4677,4678],{},"Custom tail sampling callback",[1653,4680,4681,4685,4690,4694],{},[1674,4682,4683],{},[548,4684,1026],{},[1674,4686,4687],{},[548,4688,4689],{},"DrainFunction",[1674,4691,4692],{},[548,4693,4581],{},[1674,4695,4696],{},"Drain adapter for external services",[1653,4698,4699,4704,4709,4713],{},[1674,4700,4701],{},[548,4702,4703],{},"enrich",[1674,4705,4706],{},[548,4707,4708],{},"(ctx: EnrichContext) => void",[1674,4710,4711],{},[548,4712,4581],{},[1674,4714,4715],{},"Event enrichment callback",[608,4717,4719],{"id":4718},"tail-sampling","Tail Sampling",[544,4721,4722],{},"Combine rule-based and custom tail sampling to always capture what matters, even when head sampling drops most logs:",[620,4724,4726],{"className":693,"code":4725,"filename":695,"language":696,"meta":626,"style":626},"export const { withEvlog, useLogger } = createEvlog({\n  service: 'my-app',\n  sampling: {\n    rates: { info: 10 }, \u002F\u002F Only keep 10% of info logs\n    keep: [\n      { status: 400 },              \u002F\u002F Always keep 4xx\u002F5xx\n      { duration: 1000 },           \u002F\u002F Always keep slow requests\n      { path: '\u002Fapi\u002Fcritical\u002F**' }, \u002F\u002F Always keep critical paths\n    ],\n  },\n  \u002F\u002F Custom: always keep premium user requests\n  keep: (ctx) => {\n    const user = ctx.context.user as { premium?: boolean } | undefined\n    if (user?.premium) ctx.shouldKeep = true\n  },\n})\n",[548,4727,4728,4753,4767,4775,4794,4802,4817,4831,4849,4855,4859,4864,4880,4914,4938,4942],{"__ignoreMap":626},[630,4729,4730,4732,4734,4736,4738,4740,4743,4745,4747,4749,4751],{"class":632,"line":633},[630,4731,740],{"class":703},[630,4733,744],{"class":743},[630,4735,708],{"class":707},[630,4737,749],{"class":711},[630,4739,752],{"class":707},[630,4741,4742],{"class":711}," useLogger ",[630,4744,768],{"class":707},[630,4746,771],{"class":707},[630,4748,712],{"class":774},[630,4750,777],{"class":711},[630,4752,780],{"class":707},[630,4754,4755,4757,4759,4761,4763,4765],{"class":632,"line":730},[630,4756,787],{"class":786},[630,4758,790],{"class":707},[630,4760,721],{"class":707},[630,4762,795],{"class":639},[630,4764,798],{"class":707},[630,4766,801],{"class":707},[630,4768,4769,4771,4773],{"class":632,"line":737},[630,4770,2208],{"class":786},[630,4772,790],{"class":707},[630,4774,874],{"class":707},[630,4776,4777,4779,4781,4783,4785,4787,4789,4791],{"class":632,"line":783},[630,4778,2218],{"class":786},[630,4780,790],{"class":707},[630,4782,708],{"class":707},[630,4784,2225],{"class":786},[630,4786,790],{"class":707},[630,4788,2230],{"class":2046},[630,4790,2261],{"class":707},[630,4792,4793],{"class":1492}," \u002F\u002F Only keep 10% of info logs\n",[630,4795,4796,4798,4800],{"class":632,"line":804},[630,4797,2239],{"class":786},[630,4799,790],{"class":707},[630,4801,2244],{"class":711},[630,4803,4804,4806,4808,4810,4812,4814],{"class":632,"line":923},[630,4805,2250],{"class":707},[630,4807,2253],{"class":786},[630,4809,790],{"class":707},[630,4811,2258],{"class":2046},[630,4813,2261],{"class":707},[630,4815,4816],{"class":1492},"              \u002F\u002F Always keep 4xx\u002F5xx\n",[630,4818,4819,4821,4823,4825,4827,4829],{"class":632,"line":957},[630,4820,2250],{"class":707},[630,4822,2272],{"class":786},[630,4824,790],{"class":707},[630,4826,2277],{"class":2046},[630,4828,2261],{"class":707},[630,4830,2282],{"class":1492},[630,4832,4833,4835,4837,4839,4841,4843,4845,4847],{"class":632,"line":1447},[630,4834,2250],{"class":707},[630,4836,2290],{"class":786},[630,4838,790],{"class":707},[630,4840,721],{"class":707},[630,4842,2297],{"class":639},[630,4844,798],{"class":707},[630,4846,2261],{"class":707},[630,4848,2304],{"class":1492},[630,4850,4851,4853],{"class":632,"line":1455},[630,4852,2310],{"class":711},[630,4854,801],{"class":707},[630,4856,4857],{"class":632,"line":1460},[630,4858,1835],{"class":707},[630,4860,4861],{"class":632,"line":1467},[630,4862,4863],{"class":1492},"  \u002F\u002F Custom: always keep premium user requests\n",[630,4865,4866,4868,4870,4872,4874,4876,4878],{"class":632,"line":1479},[630,4867,2443],{"class":774},[630,4869,790],{"class":707},[630,4871,2448],{"class":707},[630,4873,2452],{"class":2451},[630,4875,2455],{"class":707},[630,4877,871],{"class":743},[630,4879,874],{"class":707},[630,4881,4882,4884,4886,4888,4890,4892,4894,4896,4898,4900,4902,4904,4906,4908,4910,4912],{"class":632,"line":1489},[630,4883,2465],{"class":743},[630,4885,2468],{"class":711},[630,4887,771],{"class":707},[630,4889,2473],{"class":711},[630,4891,896],{"class":707},[630,4893,2478],{"class":711},[630,4895,896],{"class":707},[630,4897,2483],{"class":711},[630,4899,2486],{"class":703},[630,4901,708],{"class":707},[630,4903,2491],{"class":786},[630,4905,2494],{"class":707},[630,4907,2497],{"class":636},[630,4909,715],{"class":707},[630,4911,2502],{"class":707},[630,4913,2505],{"class":636},[630,4915,4916,4918,4920,4922,4924,4926,4928,4930,4932,4934,4936],{"class":632,"line":1496},[630,4917,2511],{"class":703},[630,4919,2448],{"class":786},[630,4921,2483],{"class":711},[630,4923,2518],{"class":707},[630,4925,2521],{"class":711},[630,4927,2524],{"class":786},[630,4929,2452],{"class":711},[630,4931,896],{"class":707},[630,4933,2531],{"class":711},[630,4935,771],{"class":707},[630,4937,2536],{"class":1149},[630,4939,4940],{"class":632,"line":1502},[630,4941,1835],{"class":707},[630,4943,4944,4946],{"class":632,"line":1514},[630,4945,768],{"class":707},[630,4947,809],{"class":711},[544,4949,4509,4950,4952],{},[548,4951,4666],{}," rules use OR logic: any match forces the event through regardless of head sampling.",[608,4954,365],{"id":4955},"middleware",[544,4957,4958,4959,1553,4962,4965,4966,4968],{},"Set ",[548,4960,4961],{},"x-request-id",[548,4963,4964],{},"x-evlog-start"," headers so ",[548,4967,554],{}," can correlate timing across the middleware -> handler chain:",[620,4970,4973],{"className":693,"code":4971,"filename":4972,"language":696,"meta":626,"style":626},"import { evlogMiddleware } from 'evlog\u002Fnext'\n\nexport const proxy = evlogMiddleware()\n\nexport const config = {\n  matcher: ['\u002Fapi\u002F:path*'],\n}\n","proxy.ts",[548,4974,4975,4994,4998,5013,5017,5030,5050],{"__ignoreMap":626},[630,4976,4977,4979,4981,4984,4986,4988,4990,4992],{"class":632,"line":633},[630,4978,704],{"class":703},[630,4980,708],{"class":707},[630,4982,4983],{"class":711}," evlogMiddleware",[630,4985,715],{"class":707},[630,4987,718],{"class":703},[630,4989,721],{"class":707},[630,4991,724],{"class":639},[630,4993,727],{"class":707},[630,4995,4996],{"class":632,"line":730},[630,4997,734],{"emptyLinePlaceholder":733},[630,4999,5000,5002,5004,5007,5009,5011],{"class":632,"line":737},[630,5001,740],{"class":703},[630,5003,744],{"class":743},[630,5005,5006],{"class":711}," proxy ",[630,5008,858],{"class":707},[630,5010,4983],{"class":774},[630,5012,888],{"class":711},[630,5014,5015],{"class":632,"line":783},[630,5016,734],{"emptyLinePlaceholder":733},[630,5018,5019,5021,5023,5026,5028],{"class":632,"line":804},[630,5020,740],{"class":703},[630,5022,744],{"class":743},[630,5024,5025],{"class":711}," config ",[630,5027,858],{"class":707},[630,5029,874],{"class":707},[630,5031,5032,5035,5037,5039,5041,5044,5046,5048],{"class":632,"line":923},[630,5033,5034],{"class":786},"  matcher",[630,5036,790],{"class":707},[630,5038,1808],{"class":711},[630,5040,798],{"class":707},[630,5042,5043],{"class":639},"\u002Fapi\u002F:path*",[630,5045,798],{"class":707},[630,5047,1828],{"class":711},[630,5049,801],{"class":707},[630,5051,5052],{"class":632,"line":957},[630,5053,4002],{"class":707},[982,5055,5056,5057,5060,5061,5063,5064,5066],{"color":984,"icon":13},"Older versions of Next.js use ",[548,5058,5059],{},"middleware.ts"," instead of ",[548,5062,4972],{},". The evlog middleware works with both, so just import from ",[548,5065,724],{}," regardless.",[608,5068,5070],{"id":5069},"server-actions","Server Actions",[544,5072,5073,5075],{},[548,5074,554],{}," also works with Server Actions. Wrap your action to get full request-scoped logging:",[620,5077,5080],{"className":693,"code":5078,"filename":5079,"language":696,"meta":626,"style":626},"'use server'\nimport { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const checkout = withEvlog(async (formData: FormData) => {\n  const log = useLogger()\n  log.set({ action: 'checkout', cartId: formData.get('cartId') })\n  \u002F\u002F ...\n})\n","app\u002Factions\u002Fcheckout.ts",[548,5081,5082,5091,5113,5117,5148,5160,5212,5217],{"__ignoreMap":626},[630,5083,5084,5086,5089],{"class":632,"line":633},[630,5085,798],{"class":707},[630,5087,5088],{"class":639},"use server",[630,5090,727],{"class":707},[630,5092,5093,5095,5097,5099,5101,5103,5105,5107,5109,5111],{"class":632,"line":730},[630,5094,704],{"class":703},[630,5096,708],{"class":707},[630,5098,749],{"class":711},[630,5100,752],{"class":707},[630,5102,755],{"class":711},[630,5104,715],{"class":707},[630,5106,718],{"class":703},[630,5108,721],{"class":707},[630,5110,840],{"class":639},[630,5112,727],{"class":707},[630,5114,5115],{"class":632,"line":737},[630,5116,734],{"emptyLinePlaceholder":733},[630,5118,5119,5121,5123,5126,5128,5130,5132,5134,5136,5138,5140,5142,5144,5146],{"class":632,"line":783},[630,5120,740],{"class":703},[630,5122,744],{"class":743},[630,5124,5125],{"class":711}," checkout ",[630,5127,858],{"class":707},[630,5129,749],{"class":774},[630,5131,777],{"class":711},[630,5133,865],{"class":743},[630,5135,2448],{"class":707},[630,5137,4228],{"class":2451},[630,5139,790],{"class":707},[630,5141,4233],{"class":636},[630,5143,2455],{"class":707},[630,5145,871],{"class":743},[630,5147,874],{"class":707},[630,5149,5150,5152,5154,5156,5158],{"class":632,"line":804},[630,5151,879],{"class":743},[630,5153,760],{"class":711},[630,5155,771],{"class":707},[630,5157,755],{"class":774},[630,5159,888],{"class":786},[630,5161,5162,5164,5166,5168,5170,5172,5174,5176,5178,5181,5183,5185,5188,5190,5193,5195,5197,5199,5201,5204,5206,5208,5210],{"class":632,"line":923},[630,5163,893],{"class":711},[630,5165,896],{"class":707},[630,5167,899],{"class":774},[630,5169,777],{"class":786},[630,5171,904],{"class":707},[630,5173,907],{"class":786},[630,5175,790],{"class":707},[630,5177,721],{"class":707},[630,5179,5180],{"class":639},"checkout",[630,5182,798],{"class":707},[630,5184,752],{"class":707},[630,5186,5187],{"class":786}," cartId",[630,5189,790],{"class":707},[630,5191,5192],{"class":711}," formData",[630,5194,896],{"class":707},[630,5196,4321],{"class":774},[630,5198,777],{"class":786},[630,5200,798],{"class":707},[630,5202,5203],{"class":639},"cartId",[630,5205,798],{"class":707},[630,5207,2524],{"class":786},[630,5209,768],{"class":707},[630,5211,809],{"class":786},[630,5213,5214],{"class":632,"line":957},[630,5215,5216],{"class":1492},"  \u002F\u002F ...\n",[630,5218,5219,5221],{"class":632,"line":1447},[630,5220,768],{"class":707},[630,5222,809],{"class":711},[608,5224,5226],{"id":5225},"client-provider","Client Provider",[544,5228,5229,5230,5233],{},"Wrap your root layout with ",[548,5231,5232],{},"EvlogProvider"," to enable client-side logging and its drain:",[620,5235,5238],{"className":4176,"code":5236,"filename":5237,"language":4179,"meta":626,"style":626},"import { EvlogProvider } from 'evlog\u002Fnext\u002Fclient'\n\nexport default function Layout({ children }: { children: React.ReactNode }) {\n  return (\n    \u003Chtml lang=\"en\">\n      \u003Cbody>\n        \u003CEvlogProvider service=\"my-app\" transport={{ enabled: true }}>\n          {children}\n        \u003C\u002FEvlogProvider>\n      \u003C\u002Fbody>\n    \u003C\u002Fhtml>\n  )\n}\n","app\u002Flayout.tsx",[548,5239,5240,5260,5264,5304,5311,5334,5343,5376,5386,5395,5404,5413,5418],{"__ignoreMap":626},[630,5241,5242,5244,5246,5249,5251,5253,5255,5258],{"class":632,"line":633},[630,5243,704],{"class":703},[630,5245,708],{"class":707},[630,5247,5248],{"class":711}," EvlogProvider",[630,5250,715],{"class":707},[630,5252,718],{"class":703},[630,5254,721],{"class":707},[630,5256,5257],{"class":639},"evlog\u002Fnext\u002Fclient",[630,5259,727],{"class":707},[630,5261,5262],{"class":632,"line":730},[630,5263,734],{"emptyLinePlaceholder":733},[630,5265,5266,5268,5271,5273,5276,5279,5282,5285,5287,5289,5291,5294,5296,5299,5302],{"class":632,"line":737},[630,5267,740],{"class":703},[630,5269,5270],{"class":703}," default",[630,5272,4220],{"class":743},[630,5274,5275],{"class":774}," Layout",[630,5277,5278],{"class":707},"({",[630,5280,5281],{"class":2451}," children",[630,5283,5284],{"class":707}," }:",[630,5286,708],{"class":707},[630,5288,5281],{"class":786},[630,5290,790],{"class":707},[630,5292,5293],{"class":636}," React",[630,5295,896],{"class":707},[630,5297,5298],{"class":636},"ReactNode",[630,5300,5301],{"class":707}," })",[630,5303,874],{"class":707},[630,5305,5306,5308],{"class":632,"line":783},[630,5307,926],{"class":703},[630,5309,5310],{"class":786}," (\n",[630,5312,5313,5316,5319,5322,5324,5326,5329,5331],{"class":632,"line":804},[630,5314,5315],{"class":707},"    \u003C",[630,5317,5318],{"class":786},"html",[630,5320,5321],{"class":743}," lang",[630,5323,858],{"class":707},[630,5325,3898],{"class":707},[630,5327,5328],{"class":639},"en",[630,5330,3898],{"class":707},[630,5332,5333],{"class":707},">\n",[630,5335,5336,5339,5341],{"class":632,"line":923},[630,5337,5338],{"class":707},"      \u003C",[630,5340,2983],{"class":786},[630,5342,5333],{"class":707},[630,5344,5345,5348,5350,5352,5354,5356,5358,5360,5363,5366,5369,5371,5373],{"class":632,"line":957},[630,5346,5347],{"class":707},"        \u003C",[630,5349,5232],{"class":636},[630,5351,2356],{"class":743},[630,5353,858],{"class":707},[630,5355,3898],{"class":707},[630,5357,795],{"class":639},[630,5359,3898],{"class":707},[630,5361,5362],{"class":743}," transport",[630,5364,5365],{"class":707},"={{",[630,5367,5368],{"class":786}," enabled",[630,5370,790],{"class":707},[630,5372,1150],{"class":1149},[630,5374,5375],{"class":707}," }}>\n",[630,5377,5378,5381,5384],{"class":632,"line":1447},[630,5379,5380],{"class":707},"          {",[630,5382,5383],{"class":711},"children",[630,5385,4002],{"class":707},[630,5387,5388,5391,5393],{"class":632,"line":1455},[630,5389,5390],{"class":707},"        \u003C\u002F",[630,5392,5232],{"class":636},[630,5394,5333],{"class":707},[630,5396,5397,5400,5402],{"class":632,"line":1460},[630,5398,5399],{"class":707},"      \u003C\u002F",[630,5401,2983],{"class":786},[630,5403,5333],{"class":707},[630,5405,5406,5409,5411],{"class":632,"line":1467},[630,5407,5408],{"class":707},"    \u003C\u002F",[630,5410,5318],{"class":786},[630,5412,5333],{"class":707},[630,5414,5415],{"class":632,"line":1479},[630,5416,5417],{"class":786},"  )\n",[630,5419,5420],{"class":632,"line":1489},[630,5421,4002],{"class":707},[608,5423,317],{"id":5424},"client-logging",[544,5426,3381,5427,5430],{},[548,5428,5429],{},"log"," in any client component. Identity is preserved across all logs and transported to the server:",[620,5432,5435],{"className":4176,"code":5433,"filename":5434,"language":4179,"meta":626,"style":626},"'use client'\nimport { log, setIdentity, clearIdentity } from 'evlog\u002Fnext\u002Fclient'\n\nexport function Dashboard({ user }: { user: { id: string } }) {\n  \u002F\u002F Set identity once - all subsequent logs include it\n  useEffect(() => {\n    setIdentity({ userId: user.id })\n    return () => clearIdentity()\n  }, [user.id])\n\n  return (\n    \u003Cbutton onClick={() => log.info({ action: 'export_clicked', format: 'csv' })}>\n      Export\n    \u003C\u002Fbutton>\n  )\n}\n","app\u002Fcomponents\u002FDashboard.tsx",[548,5436,5437,5445,5473,5477,5513,5518,5531,5556,5569,5585,5589,5595,5652,5657,5665,5669],{"__ignoreMap":626},[630,5438,5439,5441,5443],{"class":632,"line":633},[630,5440,798],{"class":707},[630,5442,4188],{"class":639},[630,5444,727],{"class":707},[630,5446,5447,5449,5451,5453,5455,5458,5460,5463,5465,5467,5469,5471],{"class":632,"line":730},[630,5448,704],{"class":703},[630,5450,708],{"class":707},[630,5452,760],{"class":711},[630,5454,752],{"class":707},[630,5456,5457],{"class":711}," setIdentity",[630,5459,752],{"class":707},[630,5461,5462],{"class":711}," clearIdentity",[630,5464,715],{"class":707},[630,5466,718],{"class":703},[630,5468,721],{"class":707},[630,5470,5257],{"class":639},[630,5472,727],{"class":707},[630,5474,5475],{"class":632,"line":737},[630,5476,734],{"emptyLinePlaceholder":733},[630,5478,5479,5481,5483,5486,5488,5490,5492,5494,5496,5498,5500,5502,5504,5507,5509,5511],{"class":632,"line":783},[630,5480,740],{"class":703},[630,5482,4220],{"class":743},[630,5484,5485],{"class":774}," Dashboard",[630,5487,5278],{"class":707},[630,5489,2468],{"class":2451},[630,5491,5284],{"class":707},[630,5493,708],{"class":707},[630,5495,2468],{"class":786},[630,5497,790],{"class":707},[630,5499,708],{"class":707},[630,5501,2841],{"class":786},[630,5503,790],{"class":707},[630,5505,5506],{"class":636}," string",[630,5508,715],{"class":707},[630,5510,5301],{"class":707},[630,5512,874],{"class":707},[630,5514,5515],{"class":632,"line":804},[630,5516,5517],{"class":1492},"  \u002F\u002F Set identity once - all subsequent logs include it\n",[630,5519,5520,5523,5525,5527,5529],{"class":632,"line":923},[630,5521,5522],{"class":774},"  useEffect",[630,5524,777],{"class":786},[630,5526,1262],{"class":707},[630,5528,871],{"class":743},[630,5530,874],{"class":707},[630,5532,5533,5536,5538,5540,5543,5545,5547,5549,5552,5554],{"class":632,"line":957},[630,5534,5535],{"class":774},"    setIdentity",[630,5537,777],{"class":786},[630,5539,904],{"class":707},[630,5541,5542],{"class":786}," userId",[630,5544,790],{"class":707},[630,5546,2468],{"class":711},[630,5548,896],{"class":707},[630,5550,5551],{"class":711},"id",[630,5553,715],{"class":707},[630,5555,809],{"class":786},[630,5557,5558,5561,5563,5565,5567],{"class":632,"line":1447},[630,5559,5560],{"class":703},"    return",[630,5562,868],{"class":707},[630,5564,871],{"class":743},[630,5566,5462],{"class":774},[630,5568,888],{"class":786},[630,5570,5571,5574,5576,5578,5580,5582],{"class":632,"line":1455},[630,5572,5573],{"class":707},"  },",[630,5575,1808],{"class":786},[630,5577,2483],{"class":711},[630,5579,896],{"class":707},[630,5581,5551],{"class":711},[630,5583,5584],{"class":786},"])\n",[630,5586,5587],{"class":632,"line":1460},[630,5588,734],{"emptyLinePlaceholder":733},[630,5590,5591,5593],{"class":632,"line":1467},[630,5592,926],{"class":703},[630,5594,5310],{"class":786},[630,5596,5597,5599,5602,5605,5608,5610,5612,5614,5616,5618,5620,5622,5624,5626,5629,5631,5633,5636,5638,5640,5643,5645,5647,5649],{"class":632,"line":1479},[630,5598,5315],{"class":707},[630,5600,5601],{"class":786},"button",[630,5603,5604],{"class":743}," onClick",[630,5606,5607],{"class":707},"={()",[630,5609,871],{"class":743},[630,5611,760],{"class":711},[630,5613,896],{"class":707},[630,5615,984],{"class":774},[630,5617,777],{"class":711},[630,5619,904],{"class":707},[630,5621,907],{"class":786},[630,5623,790],{"class":707},[630,5625,721],{"class":707},[630,5627,5628],{"class":639},"export_clicked",[630,5630,798],{"class":707},[630,5632,752],{"class":707},[630,5634,5635],{"class":786}," format",[630,5637,790],{"class":707},[630,5639,721],{"class":707},[630,5641,5642],{"class":639},"csv",[630,5644,798],{"class":707},[630,5646,715],{"class":707},[630,5648,2455],{"class":711},[630,5650,5651],{"class":707},"}>\n",[630,5653,5654],{"class":632,"line":1489},[630,5655,5656],{"class":711},"      Export\n",[630,5658,5659,5661,5663],{"class":632,"line":1496},[630,5660,5408],{"class":707},[630,5662,5601],{"class":786},[630,5664,5333],{"class":707},[630,5666,5667],{"class":632,"line":1502},[630,5668,5417],{"class":786},[630,5670,5671],{"class":632,"line":1514},[630,5672,4002],{"class":707},[608,5674,5676],{"id":5675},"http-drain","HTTP drain",[544,5678,5679,5680,5682],{},"For advanced use cases, send structured ",[548,5681,2024],{}," events directly from the browser to a custom endpoint:",[620,5684,5687],{"className":693,"code":5685,"filename":5686,"language":696,"meta":626,"style":626},"import { createHttpLogDrain } from 'evlog\u002Fhttp'\n\nconst drain = createHttpLogDrain({\n  drain: { endpoint: '\u002Fapi\u002Fevlog\u002Fhttp-ingest' },\n  pipeline: { batch: { size: 10, intervalMs: 5000 } },\n})\n\ndrain(drainEvent)\nawait drain.flush()\n","lib\u002Fhttp-drain.ts",[548,5688,5689,5709,5713,5727,5749,5782,5788,5792,5799],{"__ignoreMap":626},[630,5690,5691,5693,5695,5698,5700,5702,5704,5707],{"class":632,"line":633},[630,5692,704],{"class":703},[630,5694,708],{"class":707},[630,5696,5697],{"class":711}," createHttpLogDrain",[630,5699,715],{"class":707},[630,5701,718],{"class":703},[630,5703,721],{"class":707},[630,5705,5706],{"class":639},"evlog\u002Fhttp",[630,5708,727],{"class":707},[630,5710,5711],{"class":632,"line":730},[630,5712,734],{"emptyLinePlaceholder":733},[630,5714,5715,5717,5719,5721,5723,5725],{"class":632,"line":737},[630,5716,1979],{"class":743},[630,5718,2079],{"class":711},[630,5720,858],{"class":707},[630,5722,5697],{"class":774},[630,5724,777],{"class":711},[630,5726,780],{"class":707},[630,5728,5729,5731,5733,5735,5738,5740,5742,5745,5747],{"class":632,"line":783},[630,5730,1255],{"class":786},[630,5732,790],{"class":707},[630,5734,708],{"class":707},[630,5736,5737],{"class":786}," endpoint",[630,5739,790],{"class":707},[630,5741,721],{"class":707},[630,5743,5744],{"class":639},"\u002Fapi\u002Fevlog\u002Fhttp-ingest",[630,5746,798],{"class":707},[630,5748,2233],{"class":707},[630,5750,5751,5754,5756,5758,5760,5762,5764,5766,5768,5770,5772,5774,5776,5778,5780],{"class":632,"line":804},[630,5752,5753],{"class":786},"  pipeline",[630,5755,790],{"class":707},[630,5757,708],{"class":707},[630,5759,2034],{"class":786},[630,5761,790],{"class":707},[630,5763,708],{"class":707},[630,5765,2041],{"class":786},[630,5767,790],{"class":707},[630,5769,2230],{"class":2046},[630,5771,752],{"class":707},[630,5773,2052],{"class":786},[630,5775,790],{"class":707},[630,5777,2057],{"class":2046},[630,5779,715],{"class":707},[630,5781,2233],{"class":707},[630,5783,5784,5786],{"class":632,"line":923},[630,5785,768],{"class":707},[630,5787,809],{"class":711},[630,5789,5790],{"class":632,"line":957},[630,5791,734],{"emptyLinePlaceholder":733},[630,5793,5794,5796],{"class":632,"line":1447},[630,5795,1026],{"class":774},[630,5797,5798],{"class":711},"(drainEvent)\n",[630,5800,5801,5804,5807,5809,5812],{"class":632,"line":1455},[630,5802,5803],{"class":703},"await",[630,5805,5806],{"class":711}," drain",[630,5808,896],{"class":707},[630,5810,5811],{"class":774},"flush",[630,5813,888],{"class":711},[544,5815,5816],{},"The server endpoint receives batched events:",[620,5818,5821],{"className":693,"code":5819,"filename":5820,"language":696,"meta":626,"style":626},"export async function POST(request: Request) {\n  const events = await request.json()\n  \u002F\u002F Forward to your drain pipeline, Axiom, etc.\n  return new Response(null, { status: 204 })\n}\n","app\u002Fapi\u002Fevlog\u002Fhttp-ingest\u002Froute.ts",[548,5822,5823,5846,5865,5870,5897],{"__ignoreMap":626},[630,5824,5825,5827,5829,5831,5834,5836,5838,5840,5842,5844],{"class":632,"line":633},[630,5826,740],{"class":703},[630,5828,3289],{"class":743},[630,5830,4220],{"class":743},[630,5832,5833],{"class":774}," POST",[630,5835,777],{"class":707},[630,5837,2765],{"class":2451},[630,5839,790],{"class":707},[630,5841,2770],{"class":636},[630,5843,2455],{"class":707},[630,5845,874],{"class":707},[630,5847,5848,5850,5853,5855,5857,5859,5861,5863],{"class":632,"line":730},[630,5849,879],{"class":743},[630,5851,5852],{"class":711}," events",[630,5854,771],{"class":707},[630,5856,1371],{"class":703},[630,5858,2802],{"class":711},[630,5860,896],{"class":707},[630,5862,934],{"class":774},[630,5864,888],{"class":786},[630,5866,5867],{"class":632,"line":737},[630,5868,5869],{"class":1492},"  \u002F\u002F Forward to your drain pipeline, Axiom, etc.\n",[630,5871,5872,5874,5877,5879,5881,5884,5886,5888,5890,5893,5895],{"class":632,"line":783},[630,5873,926],{"class":703},[630,5875,5876],{"class":707}," new",[630,5878,929],{"class":774},[630,5880,777],{"class":786},[630,5882,5883],{"class":707},"null,",[630,5885,708],{"class":707},[630,5887,2253],{"class":786},[630,5889,790],{"class":707},[630,5891,5892],{"class":2046}," 204",[630,5894,715],{"class":707},[630,5896,809],{"class":786},[630,5898,5899],{"class":632,"line":804},[630,5900,4002],{"class":707},[608,5902,5904],{"id":5903},"run-locally","Run Locally",[620,5906,5909],{"className":622,"code":5907,"filename":5908,"language":625,"meta":626,"style":626},"git clone https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\ncd evlog\u002Fexamples\u002Fnextjs\npnpm install\npnpm run dev\n","Terminal",[548,5910,5911,5922,5930,5937],{"__ignoreMap":626},[630,5912,5913,5916,5919],{"class":632,"line":633},[630,5914,5915],{"class":636},"git",[630,5917,5918],{"class":639}," clone",[630,5920,5921],{"class":639}," https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\n",[630,5923,5924,5927],{"class":632,"line":730},[630,5925,5926],{"class":774},"cd",[630,5928,5929],{"class":639}," evlog\u002Fexamples\u002Fnextjs\n",[630,5931,5932,5934],{"class":632,"line":737},[630,5933,624],{"class":636},[630,5935,5936],{"class":639}," install\n",[630,5938,5939,5941,5944],{"class":632,"line":783},[630,5940,624],{"class":636},[630,5942,5943],{"class":639}," run",[630,5945,5946],{"class":639}," dev\n",[544,5948,5949,5950,5954],{},"Open ",[597,5951,5952],{"href":5952,"rel":5953},"http:\u002F\u002Flocalhost:3000",[601]," to explore the example.",[5956,5957,5958],"card-group",{},[5959,5960,5964],"card",{"icon":5961,"title":5962,"to":5963},"i-simple-icons-github","Source Code","https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Fnextjs","Browse the complete Next.js example source on GitHub.",[608,5966,5968],{"id":5967},"next-steps","Next Steps",[544,5970,5971,5972,5974],{},"Deepen your ",[993,5973,235],{}," integration:",[569,5976,5977,5982,5987,5992],{},[572,5978,5979,5981],{},[597,5980,46],{"href":47},": Design comprehensive events with context layering",[572,5983,5984,5986],{},[597,5985,138],{"href":143},": Send logs to Axiom, Sentry, PostHog, and more",[572,5988,5989,5991],{},[597,5990,61],{"href":62},": Control log volume with head and tail sampling",[572,5993,5994,5996,5997,1566,5999,3392,6001,6003],{},[597,5995,51],{"href":52},": Throw errors with ",[548,5998,3388],{},[548,6000,3391],{},[548,6002,3395],{}," fields",[6005,6006,6007],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}",{"title":626,"searchDepth":730,"depth":730,"links":6009},[6010,6015,6021,6022,6023,6025,6028,6029,6030,6031,6032,6033,6034,6035,6036],{"id":610,"depth":730,"text":25,"children":6011},[6012,6013,6014],{"id":614,"depth":737,"text":615},{"id":689,"depth":737,"text":690},{"id":812,"depth":737,"text":813},{"id":964,"depth":730,"text":965,"children":6016},[6017,6018,6019,6020],{"id":1029,"depth":737,"text":1030},{"id":1273,"depth":737,"text":1274},{"id":1290,"depth":737,"text":1291},{"id":1614,"depth":737,"text":508},{"id":1844,"depth":730,"text":1845},{"id":2708,"depth":730,"text":46},{"id":3175,"depth":730,"text":6024},"Background work (log.fork)",{"id":3377,"depth":730,"text":3378,"children":6026},[6027],{"id":4159,"depth":737,"text":4160},{"id":4490,"depth":730,"text":508},{"id":4718,"depth":730,"text":4719},{"id":4955,"depth":730,"text":365},{"id":5069,"depth":730,"text":5070},{"id":5225,"depth":730,"text":5226},{"id":5424,"depth":730,"text":317},{"id":5675,"depth":730,"text":5676},{"id":5903,"depth":730,"text":5904},{"id":5967,"depth":730,"text":5968},"Wide events, structured errors, drain pipeline, tail sampling, route-based services, error handling, and client-side logging in Next.js applications.","md",[6040],{"label":5962,"icon":5961,"to":5963,"color":2683,"variant":6041},"subtle",{},{"title":235,"icon":238},{"title":235,"description":6037},"8cdX0_8DqK8qiUkWaEHDEEfRe1-dDAeOX_4B6RcVq1I",[6047,6049],{"title":230,"path":231,"stem":232,"description":6048,"icon":233,"children":-1},"Add the Nuxt module and every server route emits one wide event. `useLogger(event)`, `createError` and `parseError` are auto-imported.",{"title":240,"path":241,"stem":242,"description":6050,"icon":243,"children":-1},"Wire the handle and handleError hooks once, and every SvelteKit request carries a logger on `event.locals.log` until the response ends.",1787336336054]