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