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