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