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