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