[{"data":1,"prerenderedAt":4551},["ShallowReactive",2],{"navigation_docs":3,"-frameworks-nextjs":258,"-frameworks-nextjs-surround":4546},[4,30,115,174,228,244],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24],{"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",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Frameworks","\u002Fframeworks","2.frameworks",[35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Fframeworks\u002Foverview","2.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":41,"path":42,"stem":43,"icon":44},"Nuxt","\u002Fframeworks\u002Fnuxt","2.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":46,"path":47,"stem":48,"icon":49},"Next.js","\u002Fframeworks\u002Fnextjs","2.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":51,"path":52,"stem":53,"icon":54},"SvelteKit","\u002Fframeworks\u002Fsveltekit","2.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":56,"path":57,"stem":58,"icon":59},"Nitro","\u002Fframeworks\u002Fnitro","2.frameworks\u002F04.nitro","i-custom-nitro",{"title":61,"path":62,"stem":63,"icon":64},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","2.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":66,"path":67,"stem":68,"icon":69},"NestJS","\u002Fframeworks\u002Fnestjs","2.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":71,"path":72,"stem":73,"icon":74},"Express","\u002Fframeworks\u002Fexpress","2.frameworks\u002F07.express","i-simple-icons-express",{"title":76,"path":77,"stem":78,"icon":79},"Hono","\u002Fframeworks\u002Fhono","2.frameworks\u002F08.hono","i-simple-icons-hono",{"title":81,"path":82,"stem":83,"icon":84},"Fastify","\u002Fframeworks\u002Ffastify","2.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":86,"path":87,"stem":88,"icon":89},"Elysia","\u002Fframeworks\u002Felysia","2.frameworks\u002F10.elysia","i-custom-elysia",{"title":91,"path":92,"stem":93,"icon":94},"React Router","\u002Fframeworks\u002Freact-router","2.frameworks\u002F11.react-router","i-simple-icons-reactrouter",{"title":96,"path":97,"stem":98,"icon":99},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","2.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":101,"path":102,"stem":103,"icon":104},"Standalone","\u002Fframeworks\u002Fstandalone","2.frameworks\u002F13.standalone","i-simple-icons-typescript",{"title":106,"path":107,"stem":108,"icon":109},"Astro","\u002Fframeworks\u002Fastro","2.frameworks\u002F14.astro","i-simple-icons-astro",{"title":111,"path":112,"stem":113,"icon":114},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","2.frameworks\u002F15.custom-integration","i-lucide-puzzle",{"title":116,"path":117,"stem":118,"children":119,"page":29},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[120,125,130,135,140,145,150,154,159,164,169],{"title":121,"path":122,"stem":123,"icon":124},"Request Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":126,"path":127,"stem":128,"icon":129},"Wide Events","\u002Fcore-concepts\u002Fwide-events","3.core-concepts\u002F1.wide-events","i-lucide-layers",{"title":131,"path":132,"stem":133,"icon":134},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F10.vite-plugin","i-custom-vite",{"title":136,"path":137,"stem":138,"icon":139},"AI SDK Integration","\u002Fcore-concepts\u002Fai-sdk","3.core-concepts\u002F11.ai-sdk","i-lucide-scan-eye",{"title":141,"path":142,"stem":143,"icon":144},"Structured Errors","\u002Fcore-concepts\u002Fstructured-errors","3.core-concepts\u002F2.structured-errors","i-lucide-shield-alert",{"title":146,"path":147,"stem":148,"icon":149},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F3.best-practices","i-lucide-shield-check",{"title":151,"path":152,"stem":153,"icon":104},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F4.typed-fields",{"title":155,"path":156,"stem":157,"icon":158},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F5.sampling","i-lucide-filter",{"title":160,"path":161,"stem":162,"icon":163},"Client Logging","\u002Fcore-concepts\u002Fclient-logging","3.core-concepts\u002F6.client-logging","i-lucide-monitor",{"title":165,"path":166,"stem":167,"icon":168},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F7.configuration","i-lucide-settings",{"title":170,"path":171,"stem":172,"icon":173},"Performance","\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F8.performance","i-lucide-gauge",{"title":175,"path":176,"stem":177,"children":178,"page":29},"Adapters","\u002Fadapters","4.adapters",[179,183,188,193,198,203,208,213,218,223],{"title":36,"path":180,"stem":181,"icon":182},"\u002Fadapters\u002Foverview","4.adapters\u002F1.overview","i-custom-plug",{"title":184,"path":185,"stem":186,"icon":187},"Browser","\u002Fadapters\u002Fbrowser","4.adapters\u002F10.browser","i-lucide-globe",{"title":189,"path":190,"stem":191,"icon":192},"Axiom","\u002Fadapters\u002Faxiom","4.adapters\u002F2.axiom","i-custom-axiom",{"title":194,"path":195,"stem":196,"icon":197},"OTLP","\u002Fadapters\u002Fotlp","4.adapters\u002F3.otlp","i-simple-icons-opentelemetry",{"title":199,"path":200,"stem":201,"icon":202},"PostHog","\u002Fadapters\u002Fposthog","4.adapters\u002F4.posthog","i-simple-icons-posthog",{"title":204,"path":205,"stem":206,"icon":207},"Sentry","\u002Fadapters\u002Fsentry","4.adapters\u002F5.sentry","i-simple-icons-sentry",{"title":209,"path":210,"stem":211,"icon":212},"Better Stack","\u002Fadapters\u002Fbetter-stack","4.adapters\u002F6.better-stack","i-simple-icons-betterstack",{"title":214,"path":215,"stem":216,"icon":217},"File System","\u002Fadapters\u002Ffs","4.adapters\u002F7.fs","i-lucide-hard-drive",{"title":219,"path":220,"stem":221,"icon":222},"Custom Adapters","\u002Fadapters\u002Fcustom","4.adapters\u002F8.custom","i-lucide-code",{"title":224,"path":225,"stem":226,"icon":227},"Pipeline","\u002Fadapters\u002Fpipeline","4.adapters\u002F9.pipeline","i-lucide-workflow",{"title":229,"path":230,"stem":231,"children":232,"page":29},"Enrichers","\u002Fenrichers","5.enrichers",[233,236,240],{"title":36,"path":234,"stem":235,"icon":28},"\u002Fenrichers\u002Foverview","5.enrichers\u002F1.overview",{"title":237,"path":238,"stem":239,"icon":114},"Built-in","\u002Fenrichers\u002Fbuilt-in","5.enrichers\u002F2.built-in",{"title":241,"path":242,"stem":243,"icon":222},"Custom","\u002Fenrichers\u002Fcustom","5.enrichers\u002F3.custom",{"title":245,"path":246,"stem":247,"children":248,"page":29},"NuxtHub","\u002Fnuxthub","6.nuxthub",[249,253],{"title":36,"path":250,"stem":251,"icon":252},"\u002Fnuxthub\u002Foverview","6.nuxthub\u002F1.overview","i-lucide-database",{"title":254,"path":255,"stem":256,"icon":257},"Retention","\u002Fnuxthub\u002Fretention","6.nuxthub\u002F2.retention","i-lucide-clock",{"id":259,"title":46,"body":260,"description":4536,"extension":4537,"links":4538,"meta":4542,"navigation":4543,"path":47,"seo":4544,"stem":48,"__hash__":4545},"docs\u002F2.frameworks\u002F02.nextjs.md",{"type":261,"value":262,"toc":4516},"minimark",[263,280,367,371,376,396,400,513,517,663,667,673,1511,1514,1517,1898,1901,1981,1985,2004,2475,2484,2610,2613,2680,2684,2697,2999,3012,3015,3039,3045,3260,3264,3267,3492,3497,3501,3515,3601,3614,3618,3623,3770,3774,3781,3969,3972,3978,4220,4224,4230,4360,4363,4448,4452,4493,4502,4512],[264,265,266,267,271,272,275,276,279],"p",{},"evlog integrates with Next.js App Router via a ",[268,269,270],"code",{},"createEvlog()"," factory that provides ",[268,273,274],{},"withEvlog()"," handler wrapper, ",[268,277,278],{},"useLogger()",", and typed exports. One file, zero global state.",[281,282,283],"code-collapse",{},[284,285,291],"pre",{"className":286,"code":287,"filename":288,"language":289,"meta":290,"style":290},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Set up evlog in my Next.js app with wide events and structured errors.\n\n- Install evlog: pnpm add evlog\n- Create lib\u002Fevlog.ts with createEvlog() to export withEvlog, useLogger, createError\n- Set service name and optional sampling\u002Fdrain config\n- Wrap API route handlers with withEvlog()\n- Use useLogger() inside handlers to build wide events with log.set()\n- Throw errors with createError({ message, status, why, fix })\n- Wide events are auto-emitted when each request completes\n\nDocs: https:\u002F\u002Fwww.evlog.dev\u002Fframeworks\u002Fnextjs\nAdapters: https:\u002F\u002Fwww.evlog.dev\u002Fadapters\n","Prompt","txt","",[268,292,293,301,308,314,320,326,332,338,344,350,355,361],{"__ignoreMap":290},[294,295,298],"span",{"class":296,"line":297},"line",1,[294,299,300],{},"Set up evlog in my Next.js app with wide events and structured errors.\n",[294,302,304],{"class":296,"line":303},2,[294,305,307],{"emptyLinePlaceholder":306},true,"\n",[294,309,311],{"class":296,"line":310},3,[294,312,313],{},"- Install evlog: pnpm add evlog\n",[294,315,317],{"class":296,"line":316},4,[294,318,319],{},"- Create lib\u002Fevlog.ts with createEvlog() to export withEvlog, useLogger, createError\n",[294,321,323],{"class":296,"line":322},5,[294,324,325],{},"- Set service name and optional sampling\u002Fdrain config\n",[294,327,329],{"class":296,"line":328},6,[294,330,331],{},"- Wrap API route handlers with withEvlog()\n",[294,333,335],{"class":296,"line":334},7,[294,336,337],{},"- Use useLogger() inside handlers to build wide events with log.set()\n",[294,339,341],{"class":296,"line":340},8,[294,342,343],{},"- Throw errors with createError({ message, status, why, fix })\n",[294,345,347],{"class":296,"line":346},9,[294,348,349],{},"- Wide events are auto-emitted when each request completes\n",[294,351,353],{"class":296,"line":352},10,[294,354,307],{"emptyLinePlaceholder":306},[294,356,358],{"class":296,"line":357},11,[294,359,360],{},"Docs: https:\u002F\u002Fwww.evlog.dev\u002Fframeworks\u002Fnextjs\n",[294,362,364],{"class":296,"line":363},12,[294,365,366],{},"Adapters: https:\u002F\u002Fwww.evlog.dev\u002Fadapters\n",[368,369,20],"h2",{"id":370},"quick-start",[372,373,375],"h3",{"id":374},"_1-install","1. Install",[284,377,381],{"className":378,"code":379,"language":380,"meta":290,"style":290},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun add evlog\n","bash",[268,382,383],{"__ignoreMap":290},[294,384,385,389,393],{"class":296,"line":297},[294,386,388],{"class":387},"sBMFI","bun",[294,390,392],{"class":391},"sfazB"," add",[294,394,395],{"class":391}," evlog\n",[372,397,399],{"id":398},"_2-create-your-evlog-instance","2. Create your evlog instance",[284,401,406],{"className":402,"code":403,"filename":404,"language":405,"meta":290,"style":290},"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",[268,407,408,437,441,486,506],{"__ignoreMap":290},[294,409,410,414,418,422,425,428,431,434],{"class":296,"line":297},[294,411,413],{"class":412},"s7zQu","import",[294,415,417],{"class":416},"sMK4o"," {",[294,419,421],{"class":420},"sTEyZ"," createEvlog",[294,423,424],{"class":416}," }",[294,426,427],{"class":412}," from",[294,429,430],{"class":416}," '",[294,432,433],{"class":391},"evlog\u002Fnext",[294,435,436],{"class":416},"'\n",[294,438,439],{"class":296,"line":303},[294,440,307],{"emptyLinePlaceholder":306},[294,442,443,446,450,452,455,458,461,463,466,468,471,474,477,480,483],{"class":296,"line":310},[294,444,445],{"class":412},"export",[294,447,449],{"class":448},"spNyl"," const",[294,451,417],{"class":416},[294,453,454],{"class":420}," withEvlog",[294,456,457],{"class":416},",",[294,459,460],{"class":420}," useLogger",[294,462,457],{"class":416},[294,464,465],{"class":420}," log",[294,467,457],{"class":416},[294,469,470],{"class":420}," createError ",[294,472,473],{"class":416},"}",[294,475,476],{"class":416}," =",[294,478,421],{"class":479},"s2Zo4",[294,481,482],{"class":420},"(",[294,484,485],{"class":416},"{\n",[294,487,488,492,495,497,500,503],{"class":296,"line":316},[294,489,491],{"class":490},"swJcz","  service",[294,493,494],{"class":416},":",[294,496,430],{"class":416},[294,498,499],{"class":391},"my-app",[294,501,502],{"class":416},"'",[294,504,505],{"class":416},",\n",[294,507,508,510],{"class":296,"line":322},[294,509,473],{"class":416},[294,511,512],{"class":420},")\n",[372,514,516],{"id":515},"_3-wrap-a-route-handler","3. Wrap a route handler",[284,518,521],{"className":402,"code":519,"filename":520,"language":405,"meta":290,"style":290},"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",[268,522,523,546,550,578,592,624,657],{"__ignoreMap":290},[294,524,525,527,529,531,533,535,537,539,541,544],{"class":296,"line":297},[294,526,413],{"class":412},[294,528,417],{"class":416},[294,530,454],{"class":420},[294,532,457],{"class":416},[294,534,460],{"class":420},[294,536,424],{"class":416},[294,538,427],{"class":412},[294,540,430],{"class":416},[294,542,543],{"class":391},"@\u002Flib\u002Fevlog",[294,545,436],{"class":416},[294,547,548],{"class":296,"line":303},[294,549,307],{"emptyLinePlaceholder":306},[294,551,552,554,556,559,562,564,566,569,572,575],{"class":296,"line":310},[294,553,445],{"class":412},[294,555,449],{"class":448},[294,557,558],{"class":420}," GET ",[294,560,561],{"class":416},"=",[294,563,454],{"class":479},[294,565,482],{"class":420},[294,567,568],{"class":448},"async",[294,570,571],{"class":416}," ()",[294,573,574],{"class":448}," =>",[294,576,577],{"class":416}," {\n",[294,579,580,583,585,587,589],{"class":296,"line":316},[294,581,582],{"class":448},"  const",[294,584,465],{"class":420},[294,586,476],{"class":416},[294,588,460],{"class":479},[294,590,591],{"class":490},"()\n",[294,593,594,597,600,603,605,608,611,613,615,618,620,622],{"class":296,"line":322},[294,595,596],{"class":420},"  log",[294,598,599],{"class":416},".",[294,601,602],{"class":479},"set",[294,604,482],{"class":490},[294,606,607],{"class":416},"{",[294,609,610],{"class":490}," action",[294,612,494],{"class":416},[294,614,430],{"class":416},[294,616,617],{"class":391},"hello",[294,619,502],{"class":416},[294,621,424],{"class":416},[294,623,512],{"class":490},[294,625,626,629,632,634,637,639,641,644,646,648,651,653,655],{"class":296,"line":328},[294,627,628],{"class":412},"  return",[294,630,631],{"class":420}," Response",[294,633,599],{"class":416},[294,635,636],{"class":479},"json",[294,638,482],{"class":490},[294,640,607],{"class":416},[294,642,643],{"class":490}," message",[294,645,494],{"class":416},[294,647,430],{"class":416},[294,649,650],{"class":391},"Hello!",[294,652,502],{"class":416},[294,654,424],{"class":416},[294,656,512],{"class":490},[294,658,659,661],{"class":296,"line":334},[294,660,473],{"class":416},[294,662,512],{"class":420},[368,664,666],{"id":665},"production-configuration","Production Configuration",[264,668,669,670,672],{},"A real-world ",[268,671,404],{}," with enrichers, batched drain, tail sampling, and route-based service names:",[284,674,676],{"className":402,"code":675,"filename":404,"language":405,"meta":290,"style":290},"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",[268,677,678,701,719,744,764,784,788,794,820,824,829,885,889,895,917,934,958,966,971,1004,1019,1024,1030,1040,1061,1072,1092,1110,1132,1140,1146,1151,1157,1167,1196,1223,1250,1255,1260,1266,1288,1334,1366,1371,1376,1382,1400,1430,1459,1486,1491,1496,1504],{"__ignoreMap":290},[294,679,680,682,685,687,690,692,694,696,699],{"class":296,"line":297},[294,681,413],{"class":412},[294,683,684],{"class":412}," type",[294,686,417],{"class":416},[294,688,689],{"class":420}," DrainContext",[294,691,424],{"class":416},[294,693,427],{"class":412},[294,695,430],{"class":416},[294,697,698],{"class":391},"evlog",[294,700,436],{"class":416},[294,702,703,705,707,709,711,713,715,717],{"class":296,"line":303},[294,704,413],{"class":412},[294,706,417],{"class":416},[294,708,421],{"class":420},[294,710,424],{"class":416},[294,712,427],{"class":412},[294,714,430],{"class":416},[294,716,433],{"class":391},[294,718,436],{"class":416},[294,720,721,723,725,728,730,733,735,737,739,742],{"class":296,"line":310},[294,722,413],{"class":412},[294,724,417],{"class":416},[294,726,727],{"class":420}," createUserAgentEnricher",[294,729,457],{"class":416},[294,731,732],{"class":420}," createRequestSizeEnricher",[294,734,424],{"class":416},[294,736,427],{"class":412},[294,738,430],{"class":416},[294,740,741],{"class":391},"evlog\u002Fenrichers",[294,743,436],{"class":416},[294,745,746,748,750,753,755,757,759,762],{"class":296,"line":316},[294,747,413],{"class":412},[294,749,417],{"class":416},[294,751,752],{"class":420}," createAxiomDrain",[294,754,424],{"class":416},[294,756,427],{"class":412},[294,758,430],{"class":416},[294,760,761],{"class":391},"evlog\u002Faxiom",[294,763,436],{"class":416},[294,765,766,768,770,773,775,777,779,782],{"class":296,"line":322},[294,767,413],{"class":412},[294,769,417],{"class":416},[294,771,772],{"class":420}," createDrainPipeline",[294,774,424],{"class":416},[294,776,427],{"class":412},[294,778,430],{"class":416},[294,780,781],{"class":391},"evlog\u002Fpipeline",[294,783,436],{"class":416},[294,785,786],{"class":296,"line":328},[294,787,307],{"emptyLinePlaceholder":306},[294,789,790],{"class":296,"line":334},[294,791,793],{"class":792},"sHwdD","\u002F\u002F 1. Enrichers - add derived context to every event\n",[294,795,796,799,802,804,807,810,813,815,817],{"class":296,"line":340},[294,797,798],{"class":448},"const",[294,800,801],{"class":420}," enrichers ",[294,803,561],{"class":416},[294,805,806],{"class":420}," [",[294,808,809],{"class":479},"createUserAgentEnricher",[294,811,812],{"class":420},"()",[294,814,457],{"class":416},[294,816,732],{"class":479},[294,818,819],{"class":420},"()]\n",[294,821,822],{"class":296,"line":346},[294,823,307],{"emptyLinePlaceholder":306},[294,825,826],{"class":296,"line":352},[294,827,828],{"class":792},"\u002F\u002F 2. Pipeline - batch events before sending\n",[294,830,831,833,836,838,840,843,846,849,851,853,856,858,860,863,865,869,871,874,876,879,881,883],{"class":296,"line":357},[294,832,798],{"class":448},[294,834,835],{"class":420}," pipeline ",[294,837,561],{"class":416},[294,839,772],{"class":479},[294,841,842],{"class":416},"\u003C",[294,844,845],{"class":387},"DrainContext",[294,847,848],{"class":416},">",[294,850,482],{"class":420},[294,852,607],{"class":416},[294,854,855],{"class":490}," batch",[294,857,494],{"class":416},[294,859,417],{"class":416},[294,861,862],{"class":490}," size",[294,864,494],{"class":416},[294,866,868],{"class":867},"sbssI"," 50",[294,870,457],{"class":416},[294,872,873],{"class":490}," intervalMs",[294,875,494],{"class":416},[294,877,878],{"class":867}," 5000",[294,880,424],{"class":416},[294,882,424],{"class":416},[294,884,512],{"class":420},[294,886,887],{"class":296,"line":363},[294,888,307],{"emptyLinePlaceholder":306},[294,890,892],{"class":296,"line":891},13,[294,893,894],{"class":792},"\u002F\u002F 3. Drain - send batched events to Axiom\n",[294,896,898,900,903,905,908,910,913,915],{"class":296,"line":897},14,[294,899,798],{"class":448},[294,901,902],{"class":420}," drain ",[294,904,561],{"class":416},[294,906,907],{"class":479}," pipeline",[294,909,482],{"class":420},[294,911,912],{"class":479},"createAxiomDrain",[294,914,482],{"class":420},[294,916,485],{"class":416},[294,918,920,923,925,927,930,932],{"class":296,"line":919},15,[294,921,922],{"class":490},"  dataset",[294,924,494],{"class":416},[294,926,430],{"class":416},[294,928,929],{"class":391},"logs",[294,931,502],{"class":416},[294,933,505],{"class":416},[294,935,937,940,942,945,947,950,952,955],{"class":296,"line":936},16,[294,938,939],{"class":490},"  token",[294,941,494],{"class":416},[294,943,944],{"class":420}," process",[294,946,599],{"class":416},[294,948,949],{"class":420},"env",[294,951,599],{"class":416},[294,953,954],{"class":420},"AXIOM_TOKEN",[294,956,957],{"class":416},"!,\n",[294,959,961,963],{"class":296,"line":960},17,[294,962,473],{"class":416},[294,964,965],{"class":420},"))\n",[294,967,969],{"class":296,"line":968},18,[294,970,307],{"emptyLinePlaceholder":306},[294,972,974,976,978,980,982,984,986,988,990,992,994,996,998,1000,1002],{"class":296,"line":973},19,[294,975,445],{"class":412},[294,977,449],{"class":448},[294,979,417],{"class":416},[294,981,454],{"class":420},[294,983,457],{"class":416},[294,985,460],{"class":420},[294,987,457],{"class":416},[294,989,465],{"class":420},[294,991,457],{"class":416},[294,993,470],{"class":420},[294,995,473],{"class":416},[294,997,476],{"class":416},[294,999,421],{"class":479},[294,1001,482],{"class":420},[294,1003,485],{"class":416},[294,1005,1007,1009,1011,1013,1015,1017],{"class":296,"line":1006},20,[294,1008,491],{"class":490},[294,1010,494],{"class":416},[294,1012,430],{"class":416},[294,1014,499],{"class":391},[294,1016,502],{"class":416},[294,1018,505],{"class":416},[294,1020,1022],{"class":296,"line":1021},21,[294,1023,307],{"emptyLinePlaceholder":306},[294,1025,1027],{"class":296,"line":1026},22,[294,1028,1029],{"class":792},"  \u002F\u002F 4. Head sampling - keep 10% of info logs\n",[294,1031,1033,1036,1038],{"class":296,"line":1032},23,[294,1034,1035],{"class":490},"  sampling",[294,1037,494],{"class":416},[294,1039,577],{"class":416},[294,1041,1043,1046,1048,1050,1053,1055,1058],{"class":296,"line":1042},24,[294,1044,1045],{"class":490},"    rates",[294,1047,494],{"class":416},[294,1049,417],{"class":416},[294,1051,1052],{"class":490}," info",[294,1054,494],{"class":416},[294,1056,1057],{"class":867}," 10",[294,1059,1060],{"class":416}," },\n",[294,1062,1064,1067,1069],{"class":296,"line":1063},25,[294,1065,1066],{"class":490},"    keep",[294,1068,494],{"class":416},[294,1070,1071],{"class":420}," [\n",[294,1073,1075,1078,1081,1083,1086,1089],{"class":296,"line":1074},26,[294,1076,1077],{"class":416},"      {",[294,1079,1080],{"class":490}," status",[294,1082,494],{"class":416},[294,1084,1085],{"class":867}," 400",[294,1087,1088],{"class":416}," },",[294,1090,1091],{"class":792},"              \u002F\u002F Always keep errors\n",[294,1093,1095,1097,1100,1102,1105,1107],{"class":296,"line":1094},27,[294,1096,1077],{"class":416},[294,1098,1099],{"class":490}," duration",[294,1101,494],{"class":416},[294,1103,1104],{"class":867}," 1000",[294,1106,1088],{"class":416},[294,1108,1109],{"class":792},"           \u002F\u002F Always keep slow requests\n",[294,1111,1113,1115,1118,1120,1122,1125,1127,1129],{"class":296,"line":1112},28,[294,1114,1077],{"class":416},[294,1116,1117],{"class":490}," path",[294,1119,494],{"class":416},[294,1121,430],{"class":416},[294,1123,1124],{"class":391},"\u002Fapi\u002Fcritical\u002F**",[294,1126,502],{"class":416},[294,1128,1088],{"class":416},[294,1130,1131],{"class":792}," \u002F\u002F Always keep critical paths\n",[294,1133,1135,1138],{"class":296,"line":1134},29,[294,1136,1137],{"class":420},"    ]",[294,1139,505],{"class":416},[294,1141,1143],{"class":296,"line":1142},30,[294,1144,1145],{"class":416},"  },\n",[294,1147,1149],{"class":296,"line":1148},31,[294,1150,307],{"emptyLinePlaceholder":306},[294,1152,1154],{"class":296,"line":1153},32,[294,1155,1156],{"class":792},"  \u002F\u002F 5. Route-based service names\n",[294,1158,1160,1163,1165],{"class":296,"line":1159},33,[294,1161,1162],{"class":490},"  routes",[294,1164,494],{"class":416},[294,1166,577],{"class":416},[294,1168,1170,1173,1176,1178,1180,1182,1185,1187,1189,1192,1194],{"class":296,"line":1169},34,[294,1171,1172],{"class":416},"    '",[294,1174,1175],{"class":490},"\u002Fapi\u002Fauth\u002F**",[294,1177,502],{"class":416},[294,1179,494],{"class":416},[294,1181,417],{"class":416},[294,1183,1184],{"class":490}," service",[294,1186,494],{"class":416},[294,1188,430],{"class":416},[294,1190,1191],{"class":391},"auth-service",[294,1193,502],{"class":416},[294,1195,1060],{"class":416},[294,1197,1199,1201,1204,1206,1208,1210,1212,1214,1216,1219,1221],{"class":296,"line":1198},35,[294,1200,1172],{"class":416},[294,1202,1203],{"class":490},"\u002Fapi\u002Fpayment\u002F**",[294,1205,502],{"class":416},[294,1207,494],{"class":416},[294,1209,417],{"class":416},[294,1211,1184],{"class":490},[294,1213,494],{"class":416},[294,1215,430],{"class":416},[294,1217,1218],{"class":391},"payment-service",[294,1220,502],{"class":416},[294,1222,1060],{"class":416},[294,1224,1226,1228,1231,1233,1235,1237,1239,1241,1243,1246,1248],{"class":296,"line":1225},36,[294,1227,1172],{"class":416},[294,1229,1230],{"class":490},"\u002Fapi\u002Fbooking\u002F**",[294,1232,502],{"class":416},[294,1234,494],{"class":416},[294,1236,417],{"class":416},[294,1238,1184],{"class":490},[294,1240,494],{"class":416},[294,1242,430],{"class":416},[294,1244,1245],{"class":391},"booking-service",[294,1247,502],{"class":416},[294,1249,1060],{"class":416},[294,1251,1253],{"class":296,"line":1252},37,[294,1254,1145],{"class":416},[294,1256,1258],{"class":296,"line":1257},38,[294,1259,307],{"emptyLinePlaceholder":306},[294,1261,1263],{"class":296,"line":1262},39,[294,1264,1265],{"class":792},"  \u002F\u002F 6. Custom tail sampling - business logic\n",[294,1267,1269,1272,1274,1277,1281,1284,1286],{"class":296,"line":1268},40,[294,1270,1271],{"class":479},"  keep",[294,1273,494],{"class":416},[294,1275,1276],{"class":416}," (",[294,1278,1280],{"class":1279},"sHdIc","ctx",[294,1282,1283],{"class":416},")",[294,1285,574],{"class":448},[294,1287,577],{"class":416},[294,1289,1291,1294,1297,1299,1302,1304,1307,1309,1312,1315,1317,1320,1323,1326,1328,1331],{"class":296,"line":1290},41,[294,1292,1293],{"class":448},"    const",[294,1295,1296],{"class":420}," user",[294,1298,476],{"class":416},[294,1300,1301],{"class":420}," ctx",[294,1303,599],{"class":416},[294,1305,1306],{"class":420},"context",[294,1308,599],{"class":416},[294,1310,1311],{"class":420},"user",[294,1313,1314],{"class":412}," as",[294,1316,417],{"class":416},[294,1318,1319],{"class":490}," premium",[294,1321,1322],{"class":416},"?:",[294,1324,1325],{"class":387}," boolean",[294,1327,424],{"class":416},[294,1329,1330],{"class":416}," |",[294,1332,1333],{"class":387}," undefined\n",[294,1335,1337,1340,1342,1344,1347,1350,1353,1355,1357,1360,1362],{"class":296,"line":1336},42,[294,1338,1339],{"class":412},"    if",[294,1341,1276],{"class":490},[294,1343,1311],{"class":420},[294,1345,1346],{"class":416},"?.",[294,1348,1349],{"class":420},"premium",[294,1351,1352],{"class":490},") ",[294,1354,1280],{"class":420},[294,1356,599],{"class":416},[294,1358,1359],{"class":420},"shouldKeep",[294,1361,476],{"class":416},[294,1363,1365],{"class":1364},"sfNiH"," true\n",[294,1367,1369],{"class":296,"line":1368},43,[294,1370,1145],{"class":416},[294,1372,1374],{"class":296,"line":1373},44,[294,1375,307],{"emptyLinePlaceholder":306},[294,1377,1379],{"class":296,"line":1378},45,[294,1380,1381],{"class":792},"  \u002F\u002F 7. Enrich every event with user agent, request size, and deployment info\n",[294,1383,1385,1388,1390,1392,1394,1396,1398],{"class":296,"line":1384},46,[294,1386,1387],{"class":479},"  enrich",[294,1389,494],{"class":416},[294,1391,1276],{"class":416},[294,1393,1280],{"class":1279},[294,1395,1283],{"class":416},[294,1397,574],{"class":448},[294,1399,577],{"class":416},[294,1401,1403,1406,1408,1410,1413,1416,1419,1421,1424,1426,1428],{"class":296,"line":1402},47,[294,1404,1405],{"class":412},"    for",[294,1407,1276],{"class":490},[294,1409,798],{"class":448},[294,1411,1412],{"class":420}," enricher",[294,1414,1415],{"class":416}," of",[294,1417,1418],{"class":420}," enrichers",[294,1420,1352],{"class":490},[294,1422,1423],{"class":479},"enricher",[294,1425,482],{"class":490},[294,1427,1280],{"class":420},[294,1429,512],{"class":490},[294,1431,1433,1436,1438,1441,1443,1446,1448,1450,1452,1454,1456],{"class":296,"line":1432},48,[294,1434,1435],{"class":420},"    ctx",[294,1437,599],{"class":416},[294,1439,1440],{"class":420},"event",[294,1442,599],{"class":416},[294,1444,1445],{"class":420},"deploymentId",[294,1447,476],{"class":416},[294,1449,944],{"class":420},[294,1451,599],{"class":416},[294,1453,949],{"class":420},[294,1455,599],{"class":416},[294,1457,1458],{"class":420},"VERCEL_DEPLOYMENT_ID\n",[294,1460,1462,1464,1466,1468,1470,1473,1475,1477,1479,1481,1483],{"class":296,"line":1461},49,[294,1463,1435],{"class":420},[294,1465,599],{"class":416},[294,1467,1440],{"class":420},[294,1469,599],{"class":416},[294,1471,1472],{"class":420},"region",[294,1474,476],{"class":416},[294,1476,944],{"class":420},[294,1478,599],{"class":416},[294,1480,949],{"class":420},[294,1482,599],{"class":416},[294,1484,1485],{"class":420},"VERCEL_REGION\n",[294,1487,1489],{"class":296,"line":1488},50,[294,1490,1145],{"class":416},[294,1492,1494],{"class":296,"line":1493},51,[294,1495,307],{"emptyLinePlaceholder":306},[294,1497,1499,1502],{"class":296,"line":1498},52,[294,1500,1501],{"class":420},"  drain",[294,1503,505],{"class":416},[294,1505,1507,1509],{"class":296,"line":1506},53,[294,1508,473],{"class":416},[294,1510,512],{"class":420},[368,1512,126],{"id":1513},"wide-events",[264,1515,1516],{},"Build up context progressively through your handler. One request = one wide event:",[284,1518,1521],{"className":402,"code":1519,"filename":1520,"language":405,"meta":290,"style":290},"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",[268,1522,1523,1545,1549,1582,1594,1615,1619,1624,1636,1673,1680,1684,1689,1701,1757,1763,1767,1772,1793,1805,1842,1848,1852,1892],{"__ignoreMap":290},[294,1524,1525,1527,1529,1531,1533,1535,1537,1539,1541,1543],{"class":296,"line":297},[294,1526,413],{"class":412},[294,1528,417],{"class":416},[294,1530,454],{"class":420},[294,1532,457],{"class":416},[294,1534,460],{"class":420},[294,1536,424],{"class":416},[294,1538,427],{"class":412},[294,1540,430],{"class":416},[294,1542,543],{"class":391},[294,1544,436],{"class":416},[294,1546,1547],{"class":296,"line":303},[294,1548,307],{"emptyLinePlaceholder":306},[294,1550,1551,1553,1555,1558,1560,1562,1564,1566,1568,1571,1573,1576,1578,1580],{"class":296,"line":310},[294,1552,445],{"class":412},[294,1554,449],{"class":448},[294,1556,1557],{"class":420}," POST ",[294,1559,561],{"class":416},[294,1561,454],{"class":479},[294,1563,482],{"class":420},[294,1565,568],{"class":448},[294,1567,1276],{"class":416},[294,1569,1570],{"class":1279},"request",[294,1572,494],{"class":416},[294,1574,1575],{"class":387}," Request",[294,1577,1283],{"class":416},[294,1579,574],{"class":448},[294,1581,577],{"class":416},[294,1583,1584,1586,1588,1590,1592],{"class":296,"line":316},[294,1585,582],{"class":448},[294,1587,465],{"class":420},[294,1589,476],{"class":416},[294,1591,460],{"class":479},[294,1593,591],{"class":490},[294,1595,1596,1598,1601,1603,1606,1609,1611,1613],{"class":296,"line":322},[294,1597,582],{"class":448},[294,1599,1600],{"class":420}," body",[294,1602,476],{"class":416},[294,1604,1605],{"class":412}," await",[294,1607,1608],{"class":420}," request",[294,1610,599],{"class":416},[294,1612,636],{"class":479},[294,1614,591],{"class":490},[294,1616,1617],{"class":296,"line":328},[294,1618,307],{"emptyLinePlaceholder":306},[294,1620,1621],{"class":296,"line":334},[294,1622,1623],{"class":792},"  \u002F\u002F Stage 1: User context\n",[294,1625,1626,1628,1630,1632,1634],{"class":296,"line":340},[294,1627,596],{"class":420},[294,1629,599],{"class":416},[294,1631,602],{"class":479},[294,1633,482],{"class":490},[294,1635,485],{"class":416},[294,1637,1638,1641,1643,1645,1648,1650,1652,1654,1657,1659,1662,1664,1666,1669,1671],{"class":296,"line":346},[294,1639,1640],{"class":490},"    user",[294,1642,494],{"class":416},[294,1644,417],{"class":416},[294,1646,1647],{"class":490}," id",[294,1649,494],{"class":416},[294,1651,1600],{"class":420},[294,1653,599],{"class":416},[294,1655,1656],{"class":420},"userId",[294,1658,457],{"class":416},[294,1660,1661],{"class":490}," plan",[294,1663,494],{"class":416},[294,1665,430],{"class":416},[294,1667,1668],{"class":391},"enterprise",[294,1670,502],{"class":416},[294,1672,1060],{"class":416},[294,1674,1675,1678],{"class":296,"line":352},[294,1676,1677],{"class":416},"  }",[294,1679,512],{"class":490},[294,1681,1682],{"class":296,"line":357},[294,1683,307],{"emptyLinePlaceholder":306},[294,1685,1686],{"class":296,"line":363},[294,1687,1688],{"class":792},"  \u002F\u002F Stage 2: Cart context\n",[294,1690,1691,1693,1695,1697,1699],{"class":296,"line":891},[294,1692,596],{"class":420},[294,1694,599],{"class":416},[294,1696,602],{"class":479},[294,1698,482],{"class":490},[294,1700,485],{"class":416},[294,1702,1703,1706,1708,1710,1713,1715,1717,1719,1722,1724,1727,1729,1732,1734,1736,1738,1741,1743,1746,1748,1750,1753,1755],{"class":296,"line":897},[294,1704,1705],{"class":490},"    cart",[294,1707,494],{"class":416},[294,1709,417],{"class":416},[294,1711,1712],{"class":490}," items",[294,1714,494],{"class":416},[294,1716,1600],{"class":420},[294,1718,599],{"class":416},[294,1720,1721],{"class":420},"items",[294,1723,599],{"class":416},[294,1725,1726],{"class":420},"length",[294,1728,457],{"class":416},[294,1730,1731],{"class":490}," total",[294,1733,494],{"class":416},[294,1735,1600],{"class":420},[294,1737,599],{"class":416},[294,1739,1740],{"class":420},"total",[294,1742,457],{"class":416},[294,1744,1745],{"class":490}," currency",[294,1747,494],{"class":416},[294,1749,430],{"class":416},[294,1751,1752],{"class":391},"USD",[294,1754,502],{"class":416},[294,1756,1060],{"class":416},[294,1758,1759,1761],{"class":296,"line":919},[294,1760,1677],{"class":416},[294,1762,512],{"class":490},[294,1764,1765],{"class":296,"line":936},[294,1766,307],{"emptyLinePlaceholder":306},[294,1768,1769],{"class":296,"line":960},[294,1770,1771],{"class":792},"  \u002F\u002F Stage 3: Payment context\n",[294,1773,1774,1776,1779,1781,1783,1786,1788,1791],{"class":296,"line":968},[294,1775,582],{"class":448},[294,1777,1778],{"class":420}," payment",[294,1780,476],{"class":416},[294,1782,1605],{"class":412},[294,1784,1785],{"class":479}," processPayment",[294,1787,482],{"class":490},[294,1789,1790],{"class":420},"body",[294,1792,512],{"class":490},[294,1794,1795,1797,1799,1801,1803],{"class":296,"line":973},[294,1796,596],{"class":420},[294,1798,599],{"class":416},[294,1800,602],{"class":479},[294,1802,482],{"class":490},[294,1804,485],{"class":416},[294,1806,1807,1810,1812,1814,1817,1819,1821,1823,1826,1828,1831,1833,1835,1837,1840],{"class":296,"line":1006},[294,1808,1809],{"class":490},"    payment",[294,1811,494],{"class":416},[294,1813,417],{"class":416},[294,1815,1816],{"class":490}," method",[294,1818,494],{"class":416},[294,1820,1778],{"class":420},[294,1822,599],{"class":416},[294,1824,1825],{"class":420},"method",[294,1827,457],{"class":416},[294,1829,1830],{"class":490}," cardLast4",[294,1832,494],{"class":416},[294,1834,1778],{"class":420},[294,1836,599],{"class":416},[294,1838,1839],{"class":420},"last4",[294,1841,1060],{"class":416},[294,1843,1844,1846],{"class":296,"line":1021},[294,1845,1677],{"class":416},[294,1847,512],{"class":490},[294,1849,1850],{"class":296,"line":1026},[294,1851,307],{"emptyLinePlaceholder":306},[294,1853,1854,1856,1858,1860,1862,1864,1866,1869,1871,1874,1876,1879,1881,1883,1885,1888,1890],{"class":296,"line":1032},[294,1855,628],{"class":412},[294,1857,631],{"class":420},[294,1859,599],{"class":416},[294,1861,636],{"class":479},[294,1863,482],{"class":490},[294,1865,607],{"class":416},[294,1867,1868],{"class":490}," success",[294,1870,494],{"class":416},[294,1872,1873],{"class":1364}," true",[294,1875,457],{"class":416},[294,1877,1878],{"class":490}," orderId",[294,1880,494],{"class":416},[294,1882,1778],{"class":420},[294,1884,599],{"class":416},[294,1886,1887],{"class":420},"orderId",[294,1889,424],{"class":416},[294,1891,512],{"class":490},[294,1893,1894,1896],{"class":296,"line":1042},[294,1895,473],{"class":416},[294,1897,512],{"class":420},[264,1899,1900],{},"All fields are merged into a single wide event emitted when the handler completes:",[284,1902,1905],{"className":378,"code":1903,"filename":1904,"language":380,"meta":290,"style":290},"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)",[268,1906,1907,1918,1932,1954,1970],{"__ignoreMap":290},[294,1908,1909,1912,1915],{"class":296,"line":297},[294,1910,1911],{"class":387},"10:23:45.612",[294,1913,1914],{"class":391}," INFO",[294,1916,1917],{"class":420}," [my-app] POST \u002Fapi\u002Fcheckout 200 in 145ms\n",[294,1919,1920,1923,1926,1929],{"class":296,"line":303},[294,1921,1922],{"class":387},"  ├─",[294,1924,1925],{"class":391}," user:",[294,1927,1928],{"class":391}," id=usr_123",[294,1930,1931],{"class":391}," plan=enterprise\n",[294,1933,1934,1936,1939,1942,1945,1948,1951],{"class":296,"line":310},[294,1935,1922],{"class":387},[294,1937,1938],{"class":391}," cart:",[294,1940,1941],{"class":391}," items=",[294,1943,1944],{"class":867},"3",[294,1946,1947],{"class":391}," total=",[294,1949,1950],{"class":867},"14999",[294,1952,1953],{"class":391}," currency=USD\n",[294,1955,1956,1958,1961,1964,1967],{"class":296,"line":316},[294,1957,1922],{"class":387},[294,1959,1960],{"class":391}," payment:",[294,1962,1963],{"class":391}," method=card",[294,1965,1966],{"class":391}," cardLast4=",[294,1968,1969],{"class":867},"4242\n",[294,1971,1972,1975,1978],{"class":296,"line":322},[294,1973,1974],{"class":387},"  └─",[294,1976,1977],{"class":391}," requestId:",[294,1979,1980],{"class":391}," a1b2c3d4-...\n",[368,1982,1984],{"id":1983},"error-handling","Error Handling",[264,1986,1987,1988,1991,1992,1995,1996,1999,2000,2003],{},"Use ",[268,1989,1990],{},"createError"," for structured errors with ",[268,1993,1994],{},"why",", ",[268,1997,1998],{},"fix",", and ",[268,2001,2002],{},"link"," fields that help developers debug in both logs and API responses:",[284,2005,2008],{"className":402,"code":2006,"filename":2007,"language":405,"meta":290,"style":290},"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",[268,2009,2010,2037,2041,2071,2083,2101,2105,2141,2145,2168,2179,2190,2206,2222,2238,2254,2261,2266,2270,2290,2294,2315,2356,2366,2377,2392,2416,2431,2437,2441,2445,2469],{"__ignoreMap":290},[294,2011,2012,2014,2016,2018,2020,2022,2024,2027,2029,2031,2033,2035],{"class":296,"line":297},[294,2013,413],{"class":412},[294,2015,417],{"class":416},[294,2017,454],{"class":420},[294,2019,457],{"class":416},[294,2021,460],{"class":420},[294,2023,457],{"class":416},[294,2025,2026],{"class":420}," createError",[294,2028,424],{"class":416},[294,2030,427],{"class":412},[294,2032,430],{"class":416},[294,2034,543],{"class":391},[294,2036,436],{"class":416},[294,2038,2039],{"class":296,"line":303},[294,2040,307],{"emptyLinePlaceholder":306},[294,2042,2043,2045,2047,2049,2051,2053,2055,2057,2059,2061,2063,2065,2067,2069],{"class":296,"line":310},[294,2044,445],{"class":412},[294,2046,449],{"class":448},[294,2048,1557],{"class":420},[294,2050,561],{"class":416},[294,2052,454],{"class":479},[294,2054,482],{"class":420},[294,2056,568],{"class":448},[294,2058,1276],{"class":416},[294,2060,1570],{"class":1279},[294,2062,494],{"class":416},[294,2064,1575],{"class":387},[294,2066,1283],{"class":416},[294,2068,574],{"class":448},[294,2070,577],{"class":416},[294,2072,2073,2075,2077,2079,2081],{"class":296,"line":316},[294,2074,582],{"class":448},[294,2076,465],{"class":420},[294,2078,476],{"class":416},[294,2080,460],{"class":479},[294,2082,591],{"class":490},[294,2084,2085,2087,2089,2091,2093,2095,2097,2099],{"class":296,"line":322},[294,2086,582],{"class":448},[294,2088,1600],{"class":420},[294,2090,476],{"class":416},[294,2092,1605],{"class":412},[294,2094,1608],{"class":420},[294,2096,599],{"class":416},[294,2098,636],{"class":479},[294,2100,591],{"class":490},[294,2102,2103],{"class":296,"line":328},[294,2104,307],{"emptyLinePlaceholder":306},[294,2106,2107,2109,2111,2113,2115,2117,2119,2121,2123,2126,2128,2130,2132,2135,2137,2139],{"class":296,"line":334},[294,2108,596],{"class":420},[294,2110,599],{"class":416},[294,2112,602],{"class":479},[294,2114,482],{"class":490},[294,2116,607],{"class":416},[294,2118,1778],{"class":490},[294,2120,494],{"class":416},[294,2122,417],{"class":416},[294,2124,2125],{"class":490}," amount",[294,2127,494],{"class":416},[294,2129,1600],{"class":420},[294,2131,599],{"class":416},[294,2133,2134],{"class":420},"amount",[294,2136,424],{"class":416},[294,2138,424],{"class":416},[294,2140,512],{"class":490},[294,2142,2143],{"class":296,"line":340},[294,2144,307],{"emptyLinePlaceholder":306},[294,2146,2147,2150,2152,2154,2156,2158,2161,2164,2166],{"class":296,"line":346},[294,2148,2149],{"class":412},"  if",[294,2151,1276],{"class":490},[294,2153,1790],{"class":420},[294,2155,599],{"class":416},[294,2157,2134],{"class":420},[294,2159,2160],{"class":416}," \u003C=",[294,2162,2163],{"class":867}," 0",[294,2165,1352],{"class":490},[294,2167,485],{"class":416},[294,2169,2170,2173,2175,2177],{"class":296,"line":352},[294,2171,2172],{"class":412},"    throw",[294,2174,2026],{"class":479},[294,2176,482],{"class":490},[294,2178,485],{"class":416},[294,2180,2181,2184,2186,2188],{"class":296,"line":357},[294,2182,2183],{"class":490},"      status",[294,2185,494],{"class":416},[294,2187,1085],{"class":867},[294,2189,505],{"class":416},[294,2191,2192,2195,2197,2199,2202,2204],{"class":296,"line":363},[294,2193,2194],{"class":490},"      message",[294,2196,494],{"class":416},[294,2198,430],{"class":416},[294,2200,2201],{"class":391},"Invalid payment amount",[294,2203,502],{"class":416},[294,2205,505],{"class":416},[294,2207,2208,2211,2213,2215,2218,2220],{"class":296,"line":891},[294,2209,2210],{"class":490},"      why",[294,2212,494],{"class":416},[294,2214,430],{"class":416},[294,2216,2217],{"class":391},"The amount must be a positive number",[294,2219,502],{"class":416},[294,2221,505],{"class":416},[294,2223,2224,2227,2229,2231,2234,2236],{"class":296,"line":897},[294,2225,2226],{"class":490},"      fix",[294,2228,494],{"class":416},[294,2230,430],{"class":416},[294,2232,2233],{"class":391},"Pass a positive integer in cents (e.g. 4999 for $49.99)",[294,2235,502],{"class":416},[294,2237,505],{"class":416},[294,2239,2240,2243,2245,2247,2250,2252],{"class":296,"line":919},[294,2241,2242],{"class":490},"      link",[294,2244,494],{"class":416},[294,2246,430],{"class":416},[294,2248,2249],{"class":391},"https:\u002F\u002Fdocs.example.com\u002Fapi\u002Fpayments#amount",[294,2251,502],{"class":416},[294,2253,505],{"class":416},[294,2255,2256,2259],{"class":296,"line":936},[294,2257,2258],{"class":416},"    }",[294,2260,512],{"class":490},[294,2262,2263],{"class":296,"line":960},[294,2264,2265],{"class":416},"  }\n",[294,2267,2268],{"class":296,"line":968},[294,2269,307],{"emptyLinePlaceholder":306},[294,2271,2272,2274,2277,2279,2281,2284,2286,2288],{"class":296,"line":973},[294,2273,582],{"class":448},[294,2275,2276],{"class":420}," result",[294,2278,476],{"class":416},[294,2280,1605],{"class":412},[294,2282,2283],{"class":479}," chargeCard",[294,2285,482],{"class":490},[294,2287,1790],{"class":420},[294,2289,512],{"class":490},[294,2291,2292],{"class":296,"line":1006},[294,2293,307],{"emptyLinePlaceholder":306},[294,2295,2296,2298,2300,2303,2306,2308,2311,2313],{"class":296,"line":1021},[294,2297,2149],{"class":412},[294,2299,1276],{"class":490},[294,2301,2302],{"class":416},"!",[294,2304,2305],{"class":420},"result",[294,2307,599],{"class":416},[294,2309,2310],{"class":420},"success",[294,2312,1352],{"class":490},[294,2314,485],{"class":416},[294,2316,2317,2320,2322,2325,2327,2330,2333,2335,2338,2341,2344,2346,2348,2351,2354],{"class":296,"line":1026},[294,2318,2319],{"class":420},"    log",[294,2321,599],{"class":416},[294,2323,2324],{"class":479},"error",[294,2326,482],{"class":490},[294,2328,2329],{"class":416},"new",[294,2331,2332],{"class":479}," Error",[294,2334,482],{"class":490},[294,2336,2337],{"class":416},"`",[294,2339,2340],{"class":391},"Payment declined: ",[294,2342,2343],{"class":416},"${",[294,2345,2305],{"class":420},[294,2347,599],{"class":416},[294,2349,2350],{"class":420},"reason",[294,2352,2353],{"class":416},"}`",[294,2355,965],{"class":490},[294,2357,2358,2360,2362,2364],{"class":296,"line":1032},[294,2359,2172],{"class":412},[294,2361,2026],{"class":479},[294,2363,482],{"class":490},[294,2365,485],{"class":416},[294,2367,2368,2370,2372,2375],{"class":296,"line":1042},[294,2369,2183],{"class":490},[294,2371,494],{"class":416},[294,2373,2374],{"class":867}," 402",[294,2376,505],{"class":416},[294,2378,2379,2381,2383,2385,2388,2390],{"class":296,"line":1063},[294,2380,2194],{"class":490},[294,2382,494],{"class":416},[294,2384,430],{"class":416},[294,2386,2387],{"class":391},"Payment declined",[294,2389,502],{"class":416},[294,2391,505],{"class":416},[294,2393,2394,2396,2398,2401,2404,2406,2408,2410,2412,2414],{"class":296,"line":1074},[294,2395,2210],{"class":490},[294,2397,494],{"class":416},[294,2399,2400],{"class":416}," `",[294,2402,2403],{"class":391},"Card declined by issuer: ",[294,2405,2343],{"class":416},[294,2407,2305],{"class":420},[294,2409,599],{"class":416},[294,2411,2350],{"class":420},[294,2413,2353],{"class":416},[294,2415,505],{"class":416},[294,2417,2418,2420,2422,2424,2427,2429],{"class":296,"line":1094},[294,2419,2226],{"class":490},[294,2421,494],{"class":416},[294,2423,430],{"class":416},[294,2425,2426],{"class":391},"Try a different payment method or contact your bank",[294,2428,502],{"class":416},[294,2430,505],{"class":416},[294,2432,2433,2435],{"class":296,"line":1112},[294,2434,2258],{"class":416},[294,2436,512],{"class":490},[294,2438,2439],{"class":296,"line":1134},[294,2440,2265],{"class":416},[294,2442,2443],{"class":296,"line":1142},[294,2444,307],{"emptyLinePlaceholder":306},[294,2446,2447,2449,2451,2453,2455,2457,2459,2461,2463,2465,2467],{"class":296,"line":1148},[294,2448,628],{"class":412},[294,2450,631],{"class":420},[294,2452,599],{"class":416},[294,2454,636],{"class":479},[294,2456,482],{"class":490},[294,2458,607],{"class":416},[294,2460,1868],{"class":490},[294,2462,494],{"class":416},[294,2464,1873],{"class":1364},[294,2466,424],{"class":416},[294,2468,512],{"class":490},[294,2470,2471,2473],{"class":296,"line":1153},[294,2472,473],{"class":416},[294,2474,512],{"class":420},[264,2476,2477,2479,2480,2483],{},[268,2478,274],{}," catches ",[268,2481,2482],{},"EvlogError"," and returns a structured JSON response (like Nitro does for Nuxt):",[284,2485,2489],{"className":2486,"code":2487,"filename":2488,"language":636,"meta":290,"style":290},"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)",[268,2490,2491,2495,2517,2536,2551,2564,2584,2601,2605],{"__ignoreMap":290},[294,2492,2493],{"class":296,"line":297},[294,2494,485],{"class":416},[294,2496,2497,2500,2503,2506,2508,2511,2513,2515],{"class":296,"line":303},[294,2498,2499],{"class":416},"  \"",[294,2501,2502],{"class":448},"name",[294,2504,2505],{"class":416},"\"",[294,2507,494],{"class":416},[294,2509,2510],{"class":416}," \"",[294,2512,2482],{"class":391},[294,2514,2505],{"class":416},[294,2516,505],{"class":416},[294,2518,2519,2521,2524,2526,2528,2530,2532,2534],{"class":296,"line":310},[294,2520,2499],{"class":416},[294,2522,2523],{"class":448},"message",[294,2525,2505],{"class":416},[294,2527,494],{"class":416},[294,2529,2510],{"class":416},[294,2531,2387],{"class":391},[294,2533,2505],{"class":416},[294,2535,505],{"class":416},[294,2537,2538,2540,2543,2545,2547,2549],{"class":296,"line":316},[294,2539,2499],{"class":416},[294,2541,2542],{"class":448},"status",[294,2544,2505],{"class":416},[294,2546,494],{"class":416},[294,2548,2374],{"class":867},[294,2550,505],{"class":416},[294,2552,2553,2555,2558,2560,2562],{"class":296,"line":322},[294,2554,2499],{"class":416},[294,2556,2557],{"class":448},"data",[294,2559,2505],{"class":416},[294,2561,494],{"class":416},[294,2563,577],{"class":416},[294,2565,2566,2569,2571,2573,2575,2577,2580,2582],{"class":296,"line":328},[294,2567,2568],{"class":416},"    \"",[294,2570,1994],{"class":387},[294,2572,2505],{"class":416},[294,2574,494],{"class":416},[294,2576,2510],{"class":416},[294,2578,2579],{"class":391},"Card declined by issuer: insufficient_funds",[294,2581,2505],{"class":416},[294,2583,505],{"class":416},[294,2585,2586,2588,2590,2592,2594,2596,2598],{"class":296,"line":334},[294,2587,2568],{"class":416},[294,2589,1998],{"class":387},[294,2591,2505],{"class":416},[294,2593,494],{"class":416},[294,2595,2510],{"class":416},[294,2597,2426],{"class":391},[294,2599,2600],{"class":416},"\"\n",[294,2602,2603],{"class":296,"line":340},[294,2604,2265],{"class":416},[294,2606,2607],{"class":296,"line":346},[294,2608,2609],{"class":416},"}\n",[264,2611,2612],{},"In the terminal, the error renders with colored output:",[284,2614,2617],{"className":378,"code":2615,"filename":2616,"language":380,"meta":290,"style":290},"Error: Payment declined\nWhy: Card declined by issuer: insufficient_funds\nFix: Try a different payment method or contact your bank\n","Terminal output",[268,2618,2619,2630,2650],{"__ignoreMap":290},[294,2620,2621,2624,2627],{"class":296,"line":297},[294,2622,2623],{"class":387},"Error:",[294,2625,2626],{"class":391}," Payment",[294,2628,2629],{"class":391}," declined\n",[294,2631,2632,2635,2638,2641,2644,2647],{"class":296,"line":303},[294,2633,2634],{"class":387},"Why:",[294,2636,2637],{"class":391}," Card",[294,2639,2640],{"class":391}," declined",[294,2642,2643],{"class":391}," by",[294,2645,2646],{"class":391}," issuer:",[294,2648,2649],{"class":391}," insufficient_funds\n",[294,2651,2652,2655,2658,2661,2664,2666,2668,2671,2674,2677],{"class":296,"line":310},[294,2653,2654],{"class":387},"Fix:",[294,2656,2657],{"class":391}," Try",[294,2659,2660],{"class":391}," a",[294,2662,2663],{"class":391}," different",[294,2665,1778],{"class":391},[294,2667,1816],{"class":391},[294,2669,2670],{"class":391}," or",[294,2672,2673],{"class":391}," contact",[294,2675,2676],{"class":391}," your",[294,2678,2679],{"class":391}," bank\n",[372,2681,2683],{"id":2682},"parsing-errors-on-the-client","Parsing Errors on the Client",[264,2685,1987,2686,2689,2690,2692,2693,2696],{},[268,2687,2688],{},"parseError"," to extract the structured fields from any error, whether it's a fetch response, an ",[268,2691,2482],{},", or a plain ",[268,2694,2695],{},"Error"," object:",[284,2698,2703],{"className":2699,"code":2700,"filename":2701,"language":2702,"meta":290,"style":290},"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",[268,2704,2705,2714,2733,2737,2761,2768,2795,2811,2863,2869,2922,2937,2976,2981,2986,2991,2995],{"__ignoreMap":290},[294,2706,2707,2709,2712],{"class":296,"line":297},[294,2708,502],{"class":416},[294,2710,2711],{"class":391},"use client",[294,2713,436],{"class":416},[294,2715,2716,2718,2720,2723,2725,2727,2729,2731],{"class":296,"line":303},[294,2717,413],{"class":412},[294,2719,417],{"class":416},[294,2721,2722],{"class":420}," parseError",[294,2724,424],{"class":416},[294,2726,427],{"class":412},[294,2728,430],{"class":416},[294,2730,698],{"class":391},[294,2732,436],{"class":416},[294,2734,2735],{"class":296,"line":310},[294,2736,307],{"emptyLinePlaceholder":306},[294,2738,2739,2741,2744,2747,2749,2752,2754,2757,2759],{"class":296,"line":316},[294,2740,568],{"class":448},[294,2742,2743],{"class":448}," function",[294,2745,2746],{"class":479}," handleSubmit",[294,2748,482],{"class":416},[294,2750,2751],{"class":1279},"formData",[294,2753,494],{"class":416},[294,2755,2756],{"class":387}," FormData",[294,2758,1283],{"class":416},[294,2760,577],{"class":416},[294,2762,2763,2766],{"class":296,"line":322},[294,2764,2765],{"class":412},"  try",[294,2767,577],{"class":416},[294,2769,2770,2772,2775,2777,2779,2782,2784,2786,2789,2791,2793],{"class":296,"line":328},[294,2771,1293],{"class":448},[294,2773,2774],{"class":420}," res",[294,2776,476],{"class":416},[294,2778,1605],{"class":412},[294,2780,2781],{"class":479}," fetch",[294,2783,482],{"class":490},[294,2785,502],{"class":416},[294,2787,2788],{"class":391},"\u002Fapi\u002Fpayment\u002Fprocess",[294,2790,502],{"class":416},[294,2792,457],{"class":416},[294,2794,577],{"class":416},[294,2796,2797,2800,2802,2804,2807,2809],{"class":296,"line":334},[294,2798,2799],{"class":490},"      method",[294,2801,494],{"class":416},[294,2803,430],{"class":416},[294,2805,2806],{"class":391},"POST",[294,2808,502],{"class":416},[294,2810,505],{"class":416},[294,2812,2813,2816,2818,2821,2823,2826,2828,2830,2832,2834,2837,2839,2841,2843,2846,2848,2850,2852,2854,2857,2859,2861],{"class":296,"line":340},[294,2814,2815],{"class":490},"      body",[294,2817,494],{"class":416},[294,2819,2820],{"class":420}," JSON",[294,2822,599],{"class":416},[294,2824,2825],{"class":479},"stringify",[294,2827,482],{"class":490},[294,2829,607],{"class":416},[294,2831,2125],{"class":490},[294,2833,494],{"class":416},[294,2835,2836],{"class":479}," Number",[294,2838,482],{"class":490},[294,2840,2751],{"class":420},[294,2842,599],{"class":416},[294,2844,2845],{"class":479},"get",[294,2847,482],{"class":490},[294,2849,502],{"class":416},[294,2851,2134],{"class":391},[294,2853,502],{"class":416},[294,2855,2856],{"class":490},")) ",[294,2858,473],{"class":416},[294,2860,1283],{"class":490},[294,2862,505],{"class":416},[294,2864,2865,2867],{"class":296,"line":346},[294,2866,2258],{"class":416},[294,2868,512],{"class":490},[294,2870,2871,2873,2875,2877,2880,2882,2885,2887,2890,2892,2895,2897,2899,2901,2903,2905,2907,2909,2911,2913,2915,2917,2919],{"class":296,"line":352},[294,2872,1339],{"class":412},[294,2874,1276],{"class":490},[294,2876,2302],{"class":416},[294,2878,2879],{"class":420},"res",[294,2881,599],{"class":416},[294,2883,2884],{"class":420},"ok",[294,2886,1352],{"class":490},[294,2888,2889],{"class":412},"throw",[294,2891,417],{"class":416},[294,2893,2894],{"class":490}," data",[294,2896,494],{"class":416},[294,2898,1605],{"class":412},[294,2900,2774],{"class":420},[294,2902,599],{"class":416},[294,2904,636],{"class":479},[294,2906,812],{"class":490},[294,2908,457],{"class":416},[294,2910,1080],{"class":490},[294,2912,494],{"class":416},[294,2914,2774],{"class":420},[294,2916,599],{"class":416},[294,2918,2542],{"class":420},[294,2920,2921],{"class":416}," }\n",[294,2923,2924,2926,2929,2931,2933,2935],{"class":296,"line":357},[294,2925,1677],{"class":416},[294,2927,2928],{"class":412}," catch",[294,2930,1276],{"class":490},[294,2932,2324],{"class":420},[294,2934,1352],{"class":490},[294,2936,485],{"class":416},[294,2938,2939,2941,2943,2945,2947,2949,2951,2954,2956,2959,2961,2964,2966,2968,2970,2972,2974],{"class":296,"line":363},[294,2940,1293],{"class":448},[294,2942,417],{"class":416},[294,2944,643],{"class":420},[294,2946,457],{"class":416},[294,2948,1080],{"class":420},[294,2950,457],{"class":416},[294,2952,2953],{"class":420}," why",[294,2955,457],{"class":416},[294,2957,2958],{"class":420}," fix",[294,2960,457],{"class":416},[294,2962,2963],{"class":420}," link",[294,2965,424],{"class":416},[294,2967,476],{"class":416},[294,2969,2722],{"class":479},[294,2971,482],{"class":490},[294,2973,2324],{"class":420},[294,2975,512],{"class":490},[294,2977,2978],{"class":296,"line":891},[294,2979,2980],{"class":792},"    \u002F\u002F message: \"Payment declined\"\n",[294,2982,2983],{"class":296,"line":897},[294,2984,2985],{"class":792},"    \u002F\u002F why: \"Card declined by issuer: insufficient_funds\"\n",[294,2987,2988],{"class":296,"line":919},[294,2989,2990],{"class":792},"    \u002F\u002F fix: \"Try a different payment method or contact your bank\"\n",[294,2992,2993],{"class":296,"line":936},[294,2994,2265],{"class":416},[294,2996,2997],{"class":296,"line":960},[294,2998,2609],{"class":416},[264,3000,3001,3003,3004,3007,3008,3011],{},[268,3002,2688],{}," normalizes any error shape into a flat ",[268,3005,3006],{},"{ message, status, why?, fix?, link? }"," object, so your UI code never has to dig through nested ",[268,3009,3010],{},"data.data"," or check for different error formats.",[368,3013,165],{"id":3014},"configuration",[3016,3017,3020,3021,3025,3026,1995,3029,1995,3032,1995,3035,3038],"callout",{"color":3018,"icon":3019},"info","i-lucide-book-open","See the ",[3022,3023,3024],"a",{"href":166},"Configuration reference"," for the full list of shared options (",[268,3027,3028],{},"enabled",[268,3030,3031],{},"pretty",[268,3033,3034],{},"silent",[268,3036,3037],{},"sampling",", middleware options, etc.).",[264,3040,3041,3042,3044],{},"The ",[268,3043,270],{}," factory accepts the following options:",[3046,3047,3048,3067],"table",{},[3049,3050,3051],"thead",{},[3052,3053,3054,3058,3061,3064],"tr",{},[3055,3056,3057],"th",{},"Option",[3055,3059,3060],{},"Type",[3055,3062,3063],{},"Default",[3055,3065,3066],{},"Description",[3068,3069,3070,3091,3108,3128,3146,3165,3184,3203,3222,3241],"tbody",{},[3052,3071,3072,3078,3083,3088],{},[3073,3074,3075],"td",{},[268,3076,3077],{},"service",[3073,3079,3080],{},[268,3081,3082],{},"string",[3073,3084,3085],{},[268,3086,3087],{},"'app'",[3073,3089,3090],{},"Service name shown in logs",[3052,3092,3093,3098,3102,3105],{},[3073,3094,3095],{},[268,3096,3097],{},"environment",[3073,3099,3100],{},[268,3101,3082],{},[3073,3103,3104],{},"Auto-detected",[3073,3106,3107],{},"Environment name",[3052,3109,3110,3115,3120,3125],{},[3073,3111,3112],{},[268,3113,3114],{},"include",[3073,3116,3117],{},[268,3118,3119],{},"string[]",[3073,3121,3122],{},[268,3123,3124],{},"undefined",[3073,3126,3127],{},"Route patterns to log",[3052,3129,3130,3135,3139,3143],{},[3073,3131,3132],{},[268,3133,3134],{},"exclude",[3073,3136,3137],{},[268,3138,3119],{},[3073,3140,3141],{},[268,3142,3124],{},[3073,3144,3145],{},"Route patterns to exclude",[3052,3147,3148,3153,3158,3162],{},[3073,3149,3150],{},[268,3151,3152],{},"routes",[3073,3154,3155],{},[268,3156,3157],{},"Record\u003Cstring, RouteConfig>",[3073,3159,3160],{},[268,3161,3124],{},[3073,3163,3164],{},"Route-specific service configuration",[3052,3166,3167,3172,3177,3181],{},[3073,3168,3169],{},[268,3170,3171],{},"sampling.rates",[3073,3173,3174],{},[268,3175,3176],{},"object",[3073,3178,3179],{},[268,3180,3124],{},[3073,3182,3183],{},"Head sampling rates per log level",[3052,3185,3186,3191,3196,3200],{},[3073,3187,3188],{},[268,3189,3190],{},"sampling.keep",[3073,3192,3193],{},[268,3194,3195],{},"array",[3073,3197,3198],{},[268,3199,3124],{},[3073,3201,3202],{},"Tail sampling conditions",[3052,3204,3205,3210,3215,3219],{},[3073,3206,3207],{},[268,3208,3209],{},"keep",[3073,3211,3212],{},[268,3213,3214],{},"(ctx: TailSamplingContext) => void",[3073,3216,3217],{},[268,3218,3124],{},[3073,3220,3221],{},"Custom tail sampling callback",[3052,3223,3224,3229,3234,3238],{},[3073,3225,3226],{},[268,3227,3228],{},"drain",[3073,3230,3231],{},[268,3232,3233],{},"DrainFunction",[3073,3235,3236],{},[268,3237,3124],{},[3073,3239,3240],{},"Drain adapter for external services",[3052,3242,3243,3248,3253,3257],{},[3073,3244,3245],{},[268,3246,3247],{},"enrich",[3073,3249,3250],{},[268,3251,3252],{},"(ctx: EnrichContext) => void",[3073,3254,3255],{},[268,3256,3124],{},[3073,3258,3259],{},"Event enrichment callback",[368,3261,3263],{"id":3262},"tail-sampling","Tail Sampling",[264,3265,3266],{},"Combine rule-based and custom tail sampling to always capture what matters, even when head sampling drops most logs:",[284,3268,3270],{"className":402,"code":3269,"filename":404,"language":405,"meta":290,"style":290},"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",[268,3271,3272,3297,3311,3319,3338,3346,3361,3375,3393,3399,3403,3408,3424,3458,3482,3486],{"__ignoreMap":290},[294,3273,3274,3276,3278,3280,3282,3284,3287,3289,3291,3293,3295],{"class":296,"line":297},[294,3275,445],{"class":412},[294,3277,449],{"class":448},[294,3279,417],{"class":416},[294,3281,454],{"class":420},[294,3283,457],{"class":416},[294,3285,3286],{"class":420}," useLogger ",[294,3288,473],{"class":416},[294,3290,476],{"class":416},[294,3292,421],{"class":479},[294,3294,482],{"class":420},[294,3296,485],{"class":416},[294,3298,3299,3301,3303,3305,3307,3309],{"class":296,"line":303},[294,3300,491],{"class":490},[294,3302,494],{"class":416},[294,3304,430],{"class":416},[294,3306,499],{"class":391},[294,3308,502],{"class":416},[294,3310,505],{"class":416},[294,3312,3313,3315,3317],{"class":296,"line":310},[294,3314,1035],{"class":490},[294,3316,494],{"class":416},[294,3318,577],{"class":416},[294,3320,3321,3323,3325,3327,3329,3331,3333,3335],{"class":296,"line":316},[294,3322,1045],{"class":490},[294,3324,494],{"class":416},[294,3326,417],{"class":416},[294,3328,1052],{"class":490},[294,3330,494],{"class":416},[294,3332,1057],{"class":867},[294,3334,1088],{"class":416},[294,3336,3337],{"class":792}," \u002F\u002F Only keep 10% of info logs\n",[294,3339,3340,3342,3344],{"class":296,"line":322},[294,3341,1066],{"class":490},[294,3343,494],{"class":416},[294,3345,1071],{"class":420},[294,3347,3348,3350,3352,3354,3356,3358],{"class":296,"line":328},[294,3349,1077],{"class":416},[294,3351,1080],{"class":490},[294,3353,494],{"class":416},[294,3355,1085],{"class":867},[294,3357,1088],{"class":416},[294,3359,3360],{"class":792},"              \u002F\u002F Always keep 4xx\u002F5xx\n",[294,3362,3363,3365,3367,3369,3371,3373],{"class":296,"line":334},[294,3364,1077],{"class":416},[294,3366,1099],{"class":490},[294,3368,494],{"class":416},[294,3370,1104],{"class":867},[294,3372,1088],{"class":416},[294,3374,1109],{"class":792},[294,3376,3377,3379,3381,3383,3385,3387,3389,3391],{"class":296,"line":340},[294,3378,1077],{"class":416},[294,3380,1117],{"class":490},[294,3382,494],{"class":416},[294,3384,430],{"class":416},[294,3386,1124],{"class":391},[294,3388,502],{"class":416},[294,3390,1088],{"class":416},[294,3392,1131],{"class":792},[294,3394,3395,3397],{"class":296,"line":346},[294,3396,1137],{"class":420},[294,3398,505],{"class":416},[294,3400,3401],{"class":296,"line":352},[294,3402,1145],{"class":416},[294,3404,3405],{"class":296,"line":357},[294,3406,3407],{"class":792},"  \u002F\u002F Custom: always keep premium user requests\n",[294,3409,3410,3412,3414,3416,3418,3420,3422],{"class":296,"line":363},[294,3411,1271],{"class":479},[294,3413,494],{"class":416},[294,3415,1276],{"class":416},[294,3417,1280],{"class":1279},[294,3419,1283],{"class":416},[294,3421,574],{"class":448},[294,3423,577],{"class":416},[294,3425,3426,3428,3430,3432,3434,3436,3438,3440,3442,3444,3446,3448,3450,3452,3454,3456],{"class":296,"line":891},[294,3427,1293],{"class":448},[294,3429,1296],{"class":420},[294,3431,476],{"class":416},[294,3433,1301],{"class":420},[294,3435,599],{"class":416},[294,3437,1306],{"class":420},[294,3439,599],{"class":416},[294,3441,1311],{"class":420},[294,3443,1314],{"class":412},[294,3445,417],{"class":416},[294,3447,1319],{"class":490},[294,3449,1322],{"class":416},[294,3451,1325],{"class":387},[294,3453,424],{"class":416},[294,3455,1330],{"class":416},[294,3457,1333],{"class":387},[294,3459,3460,3462,3464,3466,3468,3470,3472,3474,3476,3478,3480],{"class":296,"line":897},[294,3461,1339],{"class":412},[294,3463,1276],{"class":490},[294,3465,1311],{"class":420},[294,3467,1346],{"class":416},[294,3469,1349],{"class":420},[294,3471,1352],{"class":490},[294,3473,1280],{"class":420},[294,3475,599],{"class":416},[294,3477,1359],{"class":420},[294,3479,476],{"class":416},[294,3481,1365],{"class":1364},[294,3483,3484],{"class":296,"line":919},[294,3485,1145],{"class":416},[294,3487,3488,3490],{"class":296,"line":936},[294,3489,473],{"class":416},[294,3491,512],{"class":420},[264,3493,3041,3494,3496],{},[268,3495,3209],{}," rules use OR logic: any match forces the event through regardless of head sampling.",[368,3498,3500],{"id":3499},"middleware","Middleware",[264,3502,3503,3504,3507,3508,3511,3512,3514],{},"Set ",[268,3505,3506],{},"x-request-id"," and ",[268,3509,3510],{},"x-evlog-start"," headers so ",[268,3513,274],{}," can correlate timing across the middleware -> handler chain:",[284,3516,3519],{"className":402,"code":3517,"filename":3518,"language":405,"meta":290,"style":290},"import { evlogMiddleware } from 'evlog\u002Fnext'\n\nexport const proxy = evlogMiddleware()\n\nexport const config = {\n  matcher: ['\u002Fapi\u002F:path*'],\n}\n","proxy.ts",[268,3520,3521,3540,3544,3559,3563,3576,3597],{"__ignoreMap":290},[294,3522,3523,3525,3527,3530,3532,3534,3536,3538],{"class":296,"line":297},[294,3524,413],{"class":412},[294,3526,417],{"class":416},[294,3528,3529],{"class":420}," evlogMiddleware",[294,3531,424],{"class":416},[294,3533,427],{"class":412},[294,3535,430],{"class":416},[294,3537,433],{"class":391},[294,3539,436],{"class":416},[294,3541,3542],{"class":296,"line":303},[294,3543,307],{"emptyLinePlaceholder":306},[294,3545,3546,3548,3550,3553,3555,3557],{"class":296,"line":310},[294,3547,445],{"class":412},[294,3549,449],{"class":448},[294,3551,3552],{"class":420}," proxy ",[294,3554,561],{"class":416},[294,3556,3529],{"class":479},[294,3558,591],{"class":420},[294,3560,3561],{"class":296,"line":316},[294,3562,307],{"emptyLinePlaceholder":306},[294,3564,3565,3567,3569,3572,3574],{"class":296,"line":322},[294,3566,445],{"class":412},[294,3568,449],{"class":448},[294,3570,3571],{"class":420}," config ",[294,3573,561],{"class":416},[294,3575,577],{"class":416},[294,3577,3578,3581,3583,3585,3587,3590,3592,3595],{"class":296,"line":328},[294,3579,3580],{"class":490},"  matcher",[294,3582,494],{"class":416},[294,3584,806],{"class":420},[294,3586,502],{"class":416},[294,3588,3589],{"class":391},"\u002Fapi\u002F:path*",[294,3591,502],{"class":416},[294,3593,3594],{"class":420},"]",[294,3596,505],{"class":416},[294,3598,3599],{"class":296,"line":334},[294,3600,2609],{"class":416},[3016,3602,3603,3604,3607,3608,3610,3611,3613],{"color":3018,"icon":13},"Older versions of Next.js use ",[268,3605,3606],{},"middleware.ts"," instead of ",[268,3609,3518],{},". The evlog middleware works with both, so just import from ",[268,3612,433],{}," regardless.",[368,3615,3617],{"id":3616},"server-actions","Server Actions",[264,3619,3620,3622],{},[268,3621,274],{}," also works with Server Actions. Wrap your action to get full request-scoped logging:",[284,3624,3627],{"className":402,"code":3625,"filename":3626,"language":405,"meta":290,"style":290},"'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",[268,3628,3629,3638,3660,3664,3695,3707,3759,3764],{"__ignoreMap":290},[294,3630,3631,3633,3636],{"class":296,"line":297},[294,3632,502],{"class":416},[294,3634,3635],{"class":391},"use server",[294,3637,436],{"class":416},[294,3639,3640,3642,3644,3646,3648,3650,3652,3654,3656,3658],{"class":296,"line":303},[294,3641,413],{"class":412},[294,3643,417],{"class":416},[294,3645,454],{"class":420},[294,3647,457],{"class":416},[294,3649,460],{"class":420},[294,3651,424],{"class":416},[294,3653,427],{"class":412},[294,3655,430],{"class":416},[294,3657,543],{"class":391},[294,3659,436],{"class":416},[294,3661,3662],{"class":296,"line":310},[294,3663,307],{"emptyLinePlaceholder":306},[294,3665,3666,3668,3670,3673,3675,3677,3679,3681,3683,3685,3687,3689,3691,3693],{"class":296,"line":316},[294,3667,445],{"class":412},[294,3669,449],{"class":448},[294,3671,3672],{"class":420}," checkout ",[294,3674,561],{"class":416},[294,3676,454],{"class":479},[294,3678,482],{"class":420},[294,3680,568],{"class":448},[294,3682,1276],{"class":416},[294,3684,2751],{"class":1279},[294,3686,494],{"class":416},[294,3688,2756],{"class":387},[294,3690,1283],{"class":416},[294,3692,574],{"class":448},[294,3694,577],{"class":416},[294,3696,3697,3699,3701,3703,3705],{"class":296,"line":322},[294,3698,582],{"class":448},[294,3700,465],{"class":420},[294,3702,476],{"class":416},[294,3704,460],{"class":479},[294,3706,591],{"class":490},[294,3708,3709,3711,3713,3715,3717,3719,3721,3723,3725,3728,3730,3732,3735,3737,3740,3742,3744,3746,3748,3751,3753,3755,3757],{"class":296,"line":328},[294,3710,596],{"class":420},[294,3712,599],{"class":416},[294,3714,602],{"class":479},[294,3716,482],{"class":490},[294,3718,607],{"class":416},[294,3720,610],{"class":490},[294,3722,494],{"class":416},[294,3724,430],{"class":416},[294,3726,3727],{"class":391},"checkout",[294,3729,502],{"class":416},[294,3731,457],{"class":416},[294,3733,3734],{"class":490}," cartId",[294,3736,494],{"class":416},[294,3738,3739],{"class":420}," formData",[294,3741,599],{"class":416},[294,3743,2845],{"class":479},[294,3745,482],{"class":490},[294,3747,502],{"class":416},[294,3749,3750],{"class":391},"cartId",[294,3752,502],{"class":416},[294,3754,1352],{"class":490},[294,3756,473],{"class":416},[294,3758,512],{"class":490},[294,3760,3761],{"class":296,"line":334},[294,3762,3763],{"class":792},"  \u002F\u002F ...\n",[294,3765,3766,3768],{"class":296,"line":340},[294,3767,473],{"class":416},[294,3769,512],{"class":420},[368,3771,3773],{"id":3772},"client-provider","Client Provider",[264,3775,3776,3777,3780],{},"Wrap your root layout with ",[268,3778,3779],{},"EvlogProvider"," to enable client-side logging and transport:",[284,3782,3785],{"className":2699,"code":3783,"filename":3784,"language":2702,"meta":290,"style":290},"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",[268,3786,3787,3807,3811,3851,3858,3881,3890,3923,3933,3942,3951,3960,3965],{"__ignoreMap":290},[294,3788,3789,3791,3793,3796,3798,3800,3802,3805],{"class":296,"line":297},[294,3790,413],{"class":412},[294,3792,417],{"class":416},[294,3794,3795],{"class":420}," EvlogProvider",[294,3797,424],{"class":416},[294,3799,427],{"class":412},[294,3801,430],{"class":416},[294,3803,3804],{"class":391},"evlog\u002Fnext\u002Fclient",[294,3806,436],{"class":416},[294,3808,3809],{"class":296,"line":303},[294,3810,307],{"emptyLinePlaceholder":306},[294,3812,3813,3815,3818,3820,3823,3826,3829,3832,3834,3836,3838,3841,3843,3846,3849],{"class":296,"line":310},[294,3814,445],{"class":412},[294,3816,3817],{"class":412}," default",[294,3819,2743],{"class":448},[294,3821,3822],{"class":479}," Layout",[294,3824,3825],{"class":416},"({",[294,3827,3828],{"class":1279}," children",[294,3830,3831],{"class":416}," }:",[294,3833,417],{"class":416},[294,3835,3828],{"class":490},[294,3837,494],{"class":416},[294,3839,3840],{"class":387}," React",[294,3842,599],{"class":416},[294,3844,3845],{"class":387},"ReactNode",[294,3847,3848],{"class":416}," })",[294,3850,577],{"class":416},[294,3852,3853,3855],{"class":296,"line":316},[294,3854,628],{"class":412},[294,3856,3857],{"class":490}," (\n",[294,3859,3860,3863,3866,3869,3871,3873,3876,3878],{"class":296,"line":322},[294,3861,3862],{"class":416},"    \u003C",[294,3864,3865],{"class":490},"html",[294,3867,3868],{"class":448}," lang",[294,3870,561],{"class":416},[294,3872,2505],{"class":416},[294,3874,3875],{"class":391},"en",[294,3877,2505],{"class":416},[294,3879,3880],{"class":416},">\n",[294,3882,3883,3886,3888],{"class":296,"line":328},[294,3884,3885],{"class":416},"      \u003C",[294,3887,1790],{"class":490},[294,3889,3880],{"class":416},[294,3891,3892,3895,3897,3899,3901,3903,3905,3907,3910,3913,3916,3918,3920],{"class":296,"line":334},[294,3893,3894],{"class":416},"        \u003C",[294,3896,3779],{"class":387},[294,3898,1184],{"class":448},[294,3900,561],{"class":416},[294,3902,2505],{"class":416},[294,3904,499],{"class":391},[294,3906,2505],{"class":416},[294,3908,3909],{"class":448}," transport",[294,3911,3912],{"class":416},"={{",[294,3914,3915],{"class":490}," enabled",[294,3917,494],{"class":416},[294,3919,1873],{"class":1364},[294,3921,3922],{"class":416}," }}>\n",[294,3924,3925,3928,3931],{"class":296,"line":340},[294,3926,3927],{"class":416},"          {",[294,3929,3930],{"class":420},"children",[294,3932,2609],{"class":416},[294,3934,3935,3938,3940],{"class":296,"line":346},[294,3936,3937],{"class":416},"        \u003C\u002F",[294,3939,3779],{"class":387},[294,3941,3880],{"class":416},[294,3943,3944,3947,3949],{"class":296,"line":352},[294,3945,3946],{"class":416},"      \u003C\u002F",[294,3948,1790],{"class":490},[294,3950,3880],{"class":416},[294,3952,3953,3956,3958],{"class":296,"line":357},[294,3954,3955],{"class":416},"    \u003C\u002F",[294,3957,3865],{"class":490},[294,3959,3880],{"class":416},[294,3961,3962],{"class":296,"line":363},[294,3963,3964],{"class":490},"  )\n",[294,3966,3967],{"class":296,"line":891},[294,3968,2609],{"class":416},[368,3970,160],{"id":3971},"client-logging",[264,3973,1987,3974,3977],{},[268,3975,3976],{},"log"," in any client component. Identity is preserved across all logs and transported to the server:",[284,3979,3982],{"className":2699,"code":3980,"filename":3981,"language":2702,"meta":290,"style":290},"'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",[268,3983,3984,3992,4020,4024,4060,4065,4078,4103,4116,4132,4136,4142,4199,4204,4212,4216],{"__ignoreMap":290},[294,3985,3986,3988,3990],{"class":296,"line":297},[294,3987,502],{"class":416},[294,3989,2711],{"class":391},[294,3991,436],{"class":416},[294,3993,3994,3996,3998,4000,4002,4005,4007,4010,4012,4014,4016,4018],{"class":296,"line":303},[294,3995,413],{"class":412},[294,3997,417],{"class":416},[294,3999,465],{"class":420},[294,4001,457],{"class":416},[294,4003,4004],{"class":420}," setIdentity",[294,4006,457],{"class":416},[294,4008,4009],{"class":420}," clearIdentity",[294,4011,424],{"class":416},[294,4013,427],{"class":412},[294,4015,430],{"class":416},[294,4017,3804],{"class":391},[294,4019,436],{"class":416},[294,4021,4022],{"class":296,"line":310},[294,4023,307],{"emptyLinePlaceholder":306},[294,4025,4026,4028,4030,4033,4035,4037,4039,4041,4043,4045,4047,4049,4051,4054,4056,4058],{"class":296,"line":316},[294,4027,445],{"class":412},[294,4029,2743],{"class":448},[294,4031,4032],{"class":479}," Dashboard",[294,4034,3825],{"class":416},[294,4036,1296],{"class":1279},[294,4038,3831],{"class":416},[294,4040,417],{"class":416},[294,4042,1296],{"class":490},[294,4044,494],{"class":416},[294,4046,417],{"class":416},[294,4048,1647],{"class":490},[294,4050,494],{"class":416},[294,4052,4053],{"class":387}," string",[294,4055,424],{"class":416},[294,4057,3848],{"class":416},[294,4059,577],{"class":416},[294,4061,4062],{"class":296,"line":322},[294,4063,4064],{"class":792},"  \u002F\u002F Set identity once - all subsequent logs include it\n",[294,4066,4067,4070,4072,4074,4076],{"class":296,"line":328},[294,4068,4069],{"class":479},"  useEffect",[294,4071,482],{"class":490},[294,4073,812],{"class":416},[294,4075,574],{"class":448},[294,4077,577],{"class":416},[294,4079,4080,4083,4085,4087,4090,4092,4094,4096,4099,4101],{"class":296,"line":334},[294,4081,4082],{"class":479},"    setIdentity",[294,4084,482],{"class":490},[294,4086,607],{"class":416},[294,4088,4089],{"class":490}," userId",[294,4091,494],{"class":416},[294,4093,1296],{"class":420},[294,4095,599],{"class":416},[294,4097,4098],{"class":420},"id",[294,4100,424],{"class":416},[294,4102,512],{"class":490},[294,4104,4105,4108,4110,4112,4114],{"class":296,"line":340},[294,4106,4107],{"class":412},"    return",[294,4109,571],{"class":416},[294,4111,574],{"class":448},[294,4113,4009],{"class":479},[294,4115,591],{"class":490},[294,4117,4118,4121,4123,4125,4127,4129],{"class":296,"line":346},[294,4119,4120],{"class":416},"  },",[294,4122,806],{"class":490},[294,4124,1311],{"class":420},[294,4126,599],{"class":416},[294,4128,4098],{"class":420},[294,4130,4131],{"class":490},"])\n",[294,4133,4134],{"class":296,"line":352},[294,4135,307],{"emptyLinePlaceholder":306},[294,4137,4138,4140],{"class":296,"line":357},[294,4139,628],{"class":412},[294,4141,3857],{"class":490},[294,4143,4144,4146,4149,4152,4155,4157,4159,4161,4163,4165,4167,4169,4171,4173,4176,4178,4180,4183,4185,4187,4190,4192,4194,4196],{"class":296,"line":363},[294,4145,3862],{"class":416},[294,4147,4148],{"class":490},"button",[294,4150,4151],{"class":448}," onClick",[294,4153,4154],{"class":416},"={()",[294,4156,574],{"class":448},[294,4158,465],{"class":420},[294,4160,599],{"class":416},[294,4162,3018],{"class":479},[294,4164,482],{"class":420},[294,4166,607],{"class":416},[294,4168,610],{"class":490},[294,4170,494],{"class":416},[294,4172,430],{"class":416},[294,4174,4175],{"class":391},"export_clicked",[294,4177,502],{"class":416},[294,4179,457],{"class":416},[294,4181,4182],{"class":490}," format",[294,4184,494],{"class":416},[294,4186,430],{"class":416},[294,4188,4189],{"class":391},"csv",[294,4191,502],{"class":416},[294,4193,424],{"class":416},[294,4195,1283],{"class":420},[294,4197,4198],{"class":416},"}>\n",[294,4200,4201],{"class":296,"line":891},[294,4202,4203],{"class":420},"      Export\n",[294,4205,4206,4208,4210],{"class":296,"line":897},[294,4207,3955],{"class":416},[294,4209,4148],{"class":490},[294,4211,3880],{"class":416},[294,4213,4214],{"class":296,"line":919},[294,4215,3964],{"class":490},[294,4217,4218],{"class":296,"line":936},[294,4219,2609],{"class":416},[368,4221,4223],{"id":4222},"browser-drain","Browser Drain",[264,4225,4226,4227,4229],{},"For advanced use cases, send structured ",[268,4228,845],{}," events directly from the browser to a custom endpoint:",[284,4231,4233],{"className":402,"code":4232,"language":405,"meta":290,"style":290},"import { createBrowserLogDrain } from 'evlog\u002Fbrowser'\n\nconst drain = createBrowserLogDrain({\n  drain: { endpoint: '\u002Fapi\u002Fevlog\u002Fbrowser-ingest' },\n  pipeline: { batch: { size: 10, intervalMs: 5000 } },\n})\n\ndrain(drainEvent)\nawait drain.flush()\n",[268,4234,4235,4255,4259,4273,4295,4328,4334,4338,4345],{"__ignoreMap":290},[294,4236,4237,4239,4241,4244,4246,4248,4250,4253],{"class":296,"line":297},[294,4238,413],{"class":412},[294,4240,417],{"class":416},[294,4242,4243],{"class":420}," createBrowserLogDrain",[294,4245,424],{"class":416},[294,4247,427],{"class":412},[294,4249,430],{"class":416},[294,4251,4252],{"class":391},"evlog\u002Fbrowser",[294,4254,436],{"class":416},[294,4256,4257],{"class":296,"line":303},[294,4258,307],{"emptyLinePlaceholder":306},[294,4260,4261,4263,4265,4267,4269,4271],{"class":296,"line":310},[294,4262,798],{"class":448},[294,4264,902],{"class":420},[294,4266,561],{"class":416},[294,4268,4243],{"class":479},[294,4270,482],{"class":420},[294,4272,485],{"class":416},[294,4274,4275,4277,4279,4281,4284,4286,4288,4291,4293],{"class":296,"line":316},[294,4276,1501],{"class":490},[294,4278,494],{"class":416},[294,4280,417],{"class":416},[294,4282,4283],{"class":490}," endpoint",[294,4285,494],{"class":416},[294,4287,430],{"class":416},[294,4289,4290],{"class":391},"\u002Fapi\u002Fevlog\u002Fbrowser-ingest",[294,4292,502],{"class":416},[294,4294,1060],{"class":416},[294,4296,4297,4300,4302,4304,4306,4308,4310,4312,4314,4316,4318,4320,4322,4324,4326],{"class":296,"line":322},[294,4298,4299],{"class":490},"  pipeline",[294,4301,494],{"class":416},[294,4303,417],{"class":416},[294,4305,855],{"class":490},[294,4307,494],{"class":416},[294,4309,417],{"class":416},[294,4311,862],{"class":490},[294,4313,494],{"class":416},[294,4315,1057],{"class":867},[294,4317,457],{"class":416},[294,4319,873],{"class":490},[294,4321,494],{"class":416},[294,4323,878],{"class":867},[294,4325,424],{"class":416},[294,4327,1060],{"class":416},[294,4329,4330,4332],{"class":296,"line":328},[294,4331,473],{"class":416},[294,4333,512],{"class":420},[294,4335,4336],{"class":296,"line":334},[294,4337,307],{"emptyLinePlaceholder":306},[294,4339,4340,4342],{"class":296,"line":340},[294,4341,3228],{"class":479},[294,4343,4344],{"class":420},"(drainEvent)\n",[294,4346,4347,4350,4353,4355,4358],{"class":296,"line":346},[294,4348,4349],{"class":412},"await",[294,4351,4352],{"class":420}," drain",[294,4354,599],{"class":416},[294,4356,4357],{"class":479},"flush",[294,4359,591],{"class":420},[264,4361,4362],{},"The server endpoint receives batched events:",[284,4364,4367],{"className":402,"code":4365,"filename":4366,"language":405,"meta":290,"style":290},"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\u002Fbrowser-ingest\u002Froute.ts",[268,4368,4369,4393,4412,4417,4444],{"__ignoreMap":290},[294,4370,4371,4373,4376,4378,4381,4383,4385,4387,4389,4391],{"class":296,"line":297},[294,4372,445],{"class":412},[294,4374,4375],{"class":448}," async",[294,4377,2743],{"class":448},[294,4379,4380],{"class":479}," POST",[294,4382,482],{"class":416},[294,4384,1570],{"class":1279},[294,4386,494],{"class":416},[294,4388,1575],{"class":387},[294,4390,1283],{"class":416},[294,4392,577],{"class":416},[294,4394,4395,4397,4400,4402,4404,4406,4408,4410],{"class":296,"line":303},[294,4396,582],{"class":448},[294,4398,4399],{"class":420}," events",[294,4401,476],{"class":416},[294,4403,1605],{"class":412},[294,4405,1608],{"class":420},[294,4407,599],{"class":416},[294,4409,636],{"class":479},[294,4411,591],{"class":490},[294,4413,4414],{"class":296,"line":310},[294,4415,4416],{"class":792},"  \u002F\u002F Forward to your drain pipeline, Axiom, etc.\n",[294,4418,4419,4421,4424,4426,4428,4431,4433,4435,4437,4440,4442],{"class":296,"line":316},[294,4420,628],{"class":412},[294,4422,4423],{"class":416}," new",[294,4425,631],{"class":479},[294,4427,482],{"class":490},[294,4429,4430],{"class":416},"null,",[294,4432,417],{"class":416},[294,4434,1080],{"class":490},[294,4436,494],{"class":416},[294,4438,4439],{"class":867}," 204",[294,4441,424],{"class":416},[294,4443,512],{"class":490},[294,4445,4446],{"class":296,"line":322},[294,4447,2609],{"class":416},[368,4449,4451],{"id":4450},"run-locally","Run Locally",[284,4453,4455],{"className":378,"code":4454,"language":380,"meta":290,"style":290},"git clone https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog.git\ncd evlog\u002Fexamples\u002Fnextjs\nbun install\nbun run dev\n",[268,4456,4457,4468,4476,4483],{"__ignoreMap":290},[294,4458,4459,4462,4465],{"class":296,"line":297},[294,4460,4461],{"class":387},"git",[294,4463,4464],{"class":391}," clone",[294,4466,4467],{"class":391}," https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog.git\n",[294,4469,4470,4473],{"class":296,"line":303},[294,4471,4472],{"class":479},"cd",[294,4474,4475],{"class":391}," evlog\u002Fexamples\u002Fnextjs\n",[294,4477,4478,4480],{"class":296,"line":310},[294,4479,388],{"class":387},[294,4481,4482],{"class":391}," install\n",[294,4484,4485,4487,4490],{"class":296,"line":316},[294,4486,388],{"class":387},[294,4488,4489],{"class":391}," run",[294,4491,4492],{"class":391}," dev\n",[264,4494,4495,4496,4501],{},"Open ",[3022,4497,4498],{"href":4498,"rel":4499},"http:\u002F\u002Flocalhost:3000",[4500],"nofollow"," to explore the example.",[4503,4504,4505],"card-group",{},[4506,4507,4511],"card",{"icon":4508,"title":4509,"to":4510},"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.",[4513,4514,4515],"style",{},"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 .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 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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":290,"searchDepth":303,"depth":303,"links":4517},[4518,4523,4524,4525,4528,4529,4530,4531,4532,4533,4534,4535],{"id":370,"depth":303,"text":20,"children":4519},[4520,4521,4522],{"id":374,"depth":310,"text":375},{"id":398,"depth":310,"text":399},{"id":515,"depth":310,"text":516},{"id":665,"depth":303,"text":666},{"id":1513,"depth":303,"text":126},{"id":1983,"depth":303,"text":1984,"children":4526},[4527],{"id":2682,"depth":310,"text":2683},{"id":3014,"depth":303,"text":165},{"id":3262,"depth":303,"text":3263},{"id":3499,"depth":303,"text":3500},{"id":3616,"depth":303,"text":3617},{"id":3772,"depth":303,"text":3773},{"id":3971,"depth":303,"text":160},{"id":4222,"depth":303,"text":4223},{"id":4450,"depth":303,"text":4451},"Wide events, structured errors, drain pipeline, tail sampling, route-based services, error handling, and client-side logging in Next.js applications.","md",[4539],{"label":4509,"icon":4508,"to":4510,"color":4540,"variant":4541},"neutral","subtle",{},{"title":46,"icon":49},{"title":46,"description":4536},"xC43APgMU4_Uce7EsZwL6yvMoDcNvKJz72qfKzwQgmI",[4547,4549],{"title":41,"path":42,"stem":43,"description":4548,"icon":44,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, tail sampling, and client transport in Nuxt applications.",{"title":51,"path":52,"stem":53,"description":4550,"icon":54,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in SvelteKit applications.",1774103709796]