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