[{"data":1,"prerenderedAt":5919},["ShallowReactive",2],{"navigation_docs":3,"-frameworks-nextjs":297,"-frameworks-nextjs-surround":5914},[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":5904,"extension":5905,"links":5906,"meta":5910,"navigation":5911,"path":131,"seo":5912,"stem":132,"__hash__":5913},"docs\u002F4.frameworks\u002F02.nextjs.md",{"type":300,"value":301,"toc":5875},"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,3140,3159,3334,3338,3356,3822,3831,3956,3959,4026,4030,4043,4343,4356,4359,4376,4381,4583,4587,4590,4815,4820,4824,4837,4923,4936,4940,4945,5092,5096,5103,5291,5294,5300,5541,5545,5551,5682,5685,5769,5773,5814,5822,5832,5836,5842,5871],[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,3137,1266],{"id":3135},"background-work-logfork","Background work (",[307,3138,3139],{},"log.fork",[303,3141,3142,3143,1734,3146,3148,3149,3154,3155,639],{},"Inside ",[307,3144,3145],{},"withEvlog",[307,3147,317],{}," returns a logger with ",[738,3150,3151],{},[307,3152,3153],{},"fork"," for child wide events. See ",[711,3156,3158],{"href":3157},"\u002Flogging\u002Fwide-events#after-emit-sealing-and-background-work","Wide events — After emit",[323,3160,3163],{"className":442,"code":3161,"filename":3162,"language":445,"meta":329,"style":329},"import { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const POST = withEvlog(async () => {\n  const log = useLogger()\n  log.fork!('enqueue', async () => {\n    const child = useLogger()\n    child.set({ job: 'queued' })\n  })\n  return Response.json({ ok: true })\n})\n","app\u002Fapi\u002Forders\u002Froute.ts",[307,3164,3165,3187,3191,3213,3225,3255,3268,3297,3303,3328],{"__ignoreMap":329},[333,3166,3167,3169,3171,3173,3175,3177,3179,3181,3183,3185],{"class":335,"line":336},[333,3168,453],{"class":452},[333,3170,457],{"class":456},[333,3172,494],{"class":460},[333,3174,497],{"class":456},[333,3176,500],{"class":460},[333,3178,464],{"class":456},[333,3180,467],{"class":452},[333,3182,470],{"class":456},[333,3184,583],{"class":431},[333,3186,476],{"class":456},[333,3188,3189],{"class":335,"line":342},[333,3190,346],{"emptyLinePlaceholder":345},[333,3192,3193,3195,3197,3199,3201,3203,3205,3207,3209,3211],{"class":335,"line":349},[333,3194,485],{"class":452},[333,3196,489],{"class":488},[333,3198,2713],{"class":460},[333,3200,601],{"class":456},[333,3202,494],{"class":519},[333,3204,522],{"class":460},[333,3206,608],{"class":488},[333,3208,611],{"class":456},[333,3210,614],{"class":488},[333,3212,617],{"class":456},[333,3214,3215,3217,3219,3221,3223],{"class":335,"line":355},[333,3216,622],{"class":488},[333,3218,505],{"class":460},[333,3220,516],{"class":456},[333,3222,500],{"class":519},[333,3224,631],{"class":530},[333,3226,3227,3229,3231,3233,3236,3238,3240,3243,3245,3247,3249,3251,3253],{"class":335,"line":361},[333,3228,636],{"class":460},[333,3230,639],{"class":456},[333,3232,3153],{"class":519},[333,3234,3235],{"class":456},"!",[333,3237,522],{"class":530},[333,3239,542],{"class":456},[333,3241,3242],{"class":431},"enqueue",[333,3244,542],{"class":456},[333,3246,497],{"class":456},[333,3248,1025],{"class":488},[333,3250,611],{"class":456},[333,3252,614],{"class":488},[333,3254,617],{"class":456},[333,3256,3257,3259,3262,3264,3266],{"class":335,"line":367},[333,3258,1075],{"class":488},[333,3260,3261],{"class":460}," child",[333,3263,516],{"class":456},[333,3265,500],{"class":519},[333,3267,631],{"class":530},[333,3269,3270,3273,3275,3277,3279,3281,3284,3286,3288,3291,3293,3295],{"class":335,"line":373},[333,3271,3272],{"class":460},"    child",[333,3274,639],{"class":456},[333,3276,642],{"class":519},[333,3278,522],{"class":530},[333,3280,647],{"class":456},[333,3282,3283],{"class":530}," job",[333,3285,534],{"class":456},[333,3287,470],{"class":456},[333,3289,3290],{"class":431},"queued",[333,3292,542],{"class":456},[333,3294,464],{"class":456},[333,3296,552],{"class":530},[333,3298,3299,3301],{"class":335,"line":379},[333,3300,2831],{"class":456},[333,3302,552],{"class":530},[333,3304,3305,3307,3309,3311,3313,3315,3317,3320,3322,3324,3326],{"class":335,"line":385},[333,3306,668],{"class":452},[333,3308,671],{"class":460},[333,3310,639],{"class":456},[333,3312,676],{"class":519},[333,3314,522],{"class":530},[333,3316,647],{"class":456},[333,3318,3319],{"class":530}," ok",[333,3321,534],{"class":456},[333,3323,889],{"class":888},[333,3325,464],{"class":456},[333,3327,552],{"class":530},[333,3329,3330,3332],{"class":335,"line":391},[333,3331,513],{"class":456},[333,3333,552],{"class":460},[407,3335,3337],{"id":3336},"error-handling","Error Handling",[303,3339,3340,3341,3344,3345,1734,3348,3351,3352,3355],{},"Use ",[307,3342,3343],{},"createError"," for structured errors with ",[307,3346,3347],{},"why",[307,3349,3350],{},"fix",", and ",[307,3353,3354],{},"link"," fields that help developers debug in both logs and API responses:",[323,3357,3360],{"className":442,"code":3358,"filename":3359,"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,3361,3362,3389,3393,3423,3435,3453,3457,3493,3497,3519,3530,3541,3557,3573,3589,3605,3612,3616,3620,3640,3644,3664,3703,3713,3724,3739,3763,3778,3784,3788,3792,3816],{"__ignoreMap":329},[333,3363,3364,3366,3368,3370,3372,3374,3376,3379,3381,3383,3385,3387],{"class":335,"line":336},[333,3365,453],{"class":452},[333,3367,457],{"class":456},[333,3369,494],{"class":460},[333,3371,497],{"class":456},[333,3373,500],{"class":460},[333,3375,497],{"class":456},[333,3377,3378],{"class":460}," createError",[333,3380,464],{"class":456},[333,3382,467],{"class":452},[333,3384,470],{"class":456},[333,3386,583],{"class":431},[333,3388,476],{"class":456},[333,3390,3391],{"class":335,"line":342},[333,3392,346],{"emptyLinePlaceholder":345},[333,3394,3395,3397,3399,3401,3403,3405,3407,3409,3411,3413,3415,3417,3419,3421],{"class":335,"line":349},[333,3396,485],{"class":452},[333,3398,489],{"class":488},[333,3400,2713],{"class":460},[333,3402,601],{"class":456},[333,3404,494],{"class":519},[333,3406,522],{"class":460},[333,3408,608],{"class":488},[333,3410,1042],{"class":456},[333,3412,2726],{"class":1140},[333,3414,534],{"class":456},[333,3416,2731],{"class":427},[333,3418,1266],{"class":456},[333,3420,614],{"class":488},[333,3422,617],{"class":456},[333,3424,3425,3427,3429,3431,3433],{"class":335,"line":355},[333,3426,622],{"class":488},[333,3428,505],{"class":460},[333,3430,516],{"class":456},[333,3432,500],{"class":519},[333,3434,631],{"class":530},[333,3436,3437,3439,3441,3443,3445,3447,3449,3451],{"class":335,"line":361},[333,3438,622],{"class":488},[333,3440,2756],{"class":460},[333,3442,516],{"class":456},[333,3444,1086],{"class":452},[333,3446,1341],{"class":460},[333,3448,639],{"class":456},[333,3450,676],{"class":519},[333,3452,631],{"class":530},[333,3454,3455],{"class":335,"line":367},[333,3456,346],{"emptyLinePlaceholder":345},[333,3458,3459,3461,3463,3465,3467,3469,3471,3473,3475,3478,3480,3482,3484,3487,3489,3491],{"class":335,"line":373},[333,3460,636],{"class":460},[333,3462,639],{"class":456},[333,3464,642],{"class":519},[333,3466,522],{"class":530},[333,3468,647],{"class":456},[333,3470,2932],{"class":530},[333,3472,534],{"class":456},[333,3474,457],{"class":456},[333,3476,3477],{"class":530}," amount",[333,3479,534],{"class":456},[333,3481,2756],{"class":460},[333,3483,639],{"class":456},[333,3485,3486],{"class":460},"amount",[333,3488,464],{"class":456},[333,3490,464],{"class":456},[333,3492,552],{"class":530},[333,3494,3495],{"class":335,"line":379},[333,3496,346],{"emptyLinePlaceholder":345},[333,3498,3499,3501,3503,3505,3507,3509,3512,3515,3517],{"class":335,"line":385},[333,3500,1039],{"class":452},[333,3502,1042],{"class":530},[333,3504,2944],{"class":460},[333,3506,639],{"class":456},[333,3508,3486],{"class":460},[333,3510,3511],{"class":456}," \u003C=",[333,3513,3514],{"class":2043}," 0",[333,3516,1068],{"class":530},[333,3518,525],{"class":456},[333,3520,3521,3524,3526,3528],{"class":335,"line":391},[333,3522,3523],{"class":452},"    throw",[333,3525,3378],{"class":519},[333,3527,522],{"class":530},[333,3529,525],{"class":456},[333,3531,3532,3535,3537,3539],{"class":335,"line":396},[333,3533,3534],{"class":530},"      status",[333,3536,534],{"class":456},[333,3538,2250],{"class":2043},[333,3540,545],{"class":456},[333,3542,3543,3546,3548,3550,3553,3555],{"class":335,"line":402},[333,3544,3545],{"class":530},"      message",[333,3547,534],{"class":456},[333,3549,470],{"class":456},[333,3551,3552],{"class":431},"Invalid payment amount",[333,3554,542],{"class":456},[333,3556,545],{"class":456},[333,3558,3559,3562,3564,3566,3569,3571],{"class":335,"line":1271},[333,3560,3561],{"class":530},"      why",[333,3563,534],{"class":456},[333,3565,470],{"class":456},[333,3567,3568],{"class":431},"The amount must be a positive number",[333,3570,542],{"class":456},[333,3572,545],{"class":456},[333,3574,3575,3578,3580,3582,3585,3587],{"class":335,"line":1300},[333,3576,3577],{"class":530},"      fix",[333,3579,534],{"class":456},[333,3581,470],{"class":456},[333,3583,3584],{"class":431},"Pass a positive integer in cents (e.g. 4999 for $49.99)",[333,3586,542],{"class":456},[333,3588,545],{"class":456},[333,3590,3591,3594,3596,3598,3601,3603],{"class":335,"line":1327},[333,3592,3593],{"class":530},"      link",[333,3595,534],{"class":456},[333,3597,470],{"class":456},[333,3599,3600],{"class":431},"https:\u002F\u002Fdocs.example.com\u002Fapi\u002Fpayments#amount",[333,3602,542],{"class":456},[333,3604,545],{"class":456},[333,3606,3607,3610],{"class":335,"line":1351},[333,3608,3609],{"class":456},"    }",[333,3611,552],{"class":530},[333,3613,3614],{"class":335,"line":1356},[333,3615,1112],{"class":456},[333,3617,3618],{"class":335,"line":1661},[333,3619,346],{"emptyLinePlaceholder":345},[333,3621,3622,3624,3627,3629,3631,3634,3636,3638],{"class":335,"line":1681},[333,3623,622],{"class":488},[333,3625,3626],{"class":460}," result",[333,3628,516],{"class":456},[333,3630,1086],{"class":452},[333,3632,3633],{"class":519}," chargeCard",[333,3635,522],{"class":530},[333,3637,2944],{"class":460},[333,3639,552],{"class":530},[333,3641,3642],{"class":335,"line":1687},[333,3643,346],{"emptyLinePlaceholder":345},[333,3645,3646,3648,3650,3652,3655,3657,3660,3662],{"class":335,"line":2187},[333,3647,1039],{"class":452},[333,3649,1042],{"class":530},[333,3651,3235],{"class":456},[333,3653,3654],{"class":460},"result",[333,3656,639],{"class":456},[333,3658,3659],{"class":460},"success",[333,3661,1068],{"class":530},[333,3663,525],{"class":456},[333,3665,3666,3669,3671,3673,3675,3678,3680,3682,3685,3688,3691,3693,3695,3698,3701],{"class":335,"line":2192},[333,3667,3668],{"class":460},"    log",[333,3670,639],{"class":456},[333,3672,1336],{"class":519},[333,3674,522],{"class":530},[333,3676,3677],{"class":456},"new",[333,3679,1162],{"class":519},[333,3681,522],{"class":530},[333,3683,3684],{"class":456},"`",[333,3686,3687],{"class":431},"Payment declined: ",[333,3689,3690],{"class":456},"${",[333,3692,3654],{"class":460},[333,3694,639],{"class":456},[333,3696,3697],{"class":460},"reason",[333,3699,3700],{"class":456},"}`",[333,3702,1000],{"class":530},[333,3704,3705,3707,3709,3711],{"class":335,"line":2198},[333,3706,3523],{"class":452},[333,3708,3378],{"class":519},[333,3710,522],{"class":530},[333,3712,525],{"class":456},[333,3714,3715,3717,3719,3722],{"class":335,"line":2208},[333,3716,3534],{"class":530},[333,3718,534],{"class":456},[333,3720,3721],{"class":2043}," 402",[333,3723,545],{"class":456},[333,3725,3726,3728,3730,3732,3735,3737],{"class":335,"line":2228},[333,3727,3545],{"class":530},[333,3729,534],{"class":456},[333,3731,470],{"class":456},[333,3733,3734],{"class":431},"Payment declined",[333,3736,542],{"class":456},[333,3738,545],{"class":456},[333,3740,3741,3743,3745,3748,3751,3753,3755,3757,3759,3761],{"class":335,"line":2239},[333,3742,3561],{"class":530},[333,3744,534],{"class":456},[333,3746,3747],{"class":456}," `",[333,3749,3750],{"class":431},"Card declined by issuer: ",[333,3752,3690],{"class":456},[333,3754,3654],{"class":460},[333,3756,639],{"class":456},[333,3758,3697],{"class":460},[333,3760,3700],{"class":456},[333,3762,545],{"class":456},[333,3764,3765,3767,3769,3771,3774,3776],{"class":335,"line":2259},[333,3766,3577],{"class":530},[333,3768,534],{"class":456},[333,3770,470],{"class":456},[333,3772,3773],{"class":431},"Try a different payment method or contact your bank",[333,3775,542],{"class":456},[333,3777,545],{"class":456},[333,3779,3780,3782],{"class":335,"line":2277},[333,3781,3609],{"class":456},[333,3783,552],{"class":530},[333,3785,3786],{"class":335,"line":2298},[333,3787,1112],{"class":456},[333,3789,3790],{"class":335,"line":2306},[333,3791,346],{"emptyLinePlaceholder":345},[333,3793,3794,3796,3798,3800,3802,3804,3806,3808,3810,3812,3814],{"class":335,"line":2312},[333,3795,668],{"class":452},[333,3797,671],{"class":460},[333,3799,639],{"class":456},[333,3801,676],{"class":519},[333,3803,522],{"class":530},[333,3805,647],{"class":456},[333,3807,3021],{"class":530},[333,3809,534],{"class":456},[333,3811,889],{"class":888},[333,3813,464],{"class":456},[333,3815,552],{"class":530},[333,3817,3818,3820],{"class":335,"line":2317},[333,3819,513],{"class":456},[333,3821,552],{"class":460},[303,3823,3824,3826,3827,3830],{},[307,3825,313],{}," catches ",[307,3828,3829],{},"EvlogError"," and returns a structured JSON response (like Nitro does for Nuxt):",[323,3832,3836],{"className":3833,"code":3834,"filename":3835,"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,3837,3838,3842,3864,3883,3898,3911,3931,3948,3952],{"__ignoreMap":329},[333,3839,3840],{"class":335,"line":336},[333,3841,525],{"class":456},[333,3843,3844,3847,3850,3853,3855,3858,3860,3862],{"class":335,"line":342},[333,3845,3846],{"class":456},"  \"",[333,3848,3849],{"class":488},"name",[333,3851,3852],{"class":456},"\"",[333,3854,534],{"class":456},[333,3856,3857],{"class":456}," \"",[333,3859,3829],{"class":431},[333,3861,3852],{"class":456},[333,3863,545],{"class":456},[333,3865,3866,3868,3871,3873,3875,3877,3879,3881],{"class":335,"line":349},[333,3867,3846],{"class":456},[333,3869,3870],{"class":488},"message",[333,3872,3852],{"class":456},[333,3874,534],{"class":456},[333,3876,3857],{"class":456},[333,3878,3734],{"class":431},[333,3880,3852],{"class":456},[333,3882,545],{"class":456},[333,3884,3885,3887,3890,3892,3894,3896],{"class":335,"line":355},[333,3886,3846],{"class":456},[333,3888,3889],{"class":488},"status",[333,3891,3852],{"class":456},[333,3893,534],{"class":456},[333,3895,3721],{"class":2043},[333,3897,545],{"class":456},[333,3899,3900,3902,3905,3907,3909],{"class":335,"line":361},[333,3901,3846],{"class":456},[333,3903,3904],{"class":488},"data",[333,3906,3852],{"class":456},[333,3908,534],{"class":456},[333,3910,617],{"class":456},[333,3912,3913,3916,3918,3920,3922,3924,3927,3929],{"class":335,"line":367},[333,3914,3915],{"class":456},"    \"",[333,3917,3347],{"class":427},[333,3919,3852],{"class":456},[333,3921,534],{"class":456},[333,3923,3857],{"class":456},[333,3925,3926],{"class":431},"Card declined by issuer: insufficient_funds",[333,3928,3852],{"class":456},[333,3930,545],{"class":456},[333,3932,3933,3935,3937,3939,3941,3943,3945],{"class":335,"line":373},[333,3934,3915],{"class":456},[333,3936,3350],{"class":427},[333,3938,3852],{"class":456},[333,3940,534],{"class":456},[333,3942,3857],{"class":456},[333,3944,3773],{"class":431},[333,3946,3947],{"class":456},"\"\n",[333,3949,3950],{"class":335,"line":379},[333,3951,1112],{"class":456},[333,3953,3954],{"class":335,"line":385},[333,3955,1117],{"class":456},[303,3957,3958],{},"In the terminal, the error renders with colored output:",[323,3960,3963],{"className":417,"code":3961,"filename":3962,"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,3964,3965,3976,3996],{"__ignoreMap":329},[333,3966,3967,3970,3973],{"class":335,"line":336},[333,3968,3969],{"class":427},"Error:",[333,3971,3972],{"class":431}," Payment",[333,3974,3975],{"class":431}," declined\n",[333,3977,3978,3981,3984,3987,3990,3993],{"class":335,"line":342},[333,3979,3980],{"class":427},"Why:",[333,3982,3983],{"class":431}," Card",[333,3985,3986],{"class":431}," declined",[333,3988,3989],{"class":431}," by",[333,3991,3992],{"class":431}," issuer:",[333,3994,3995],{"class":431}," insufficient_funds\n",[333,3997,3998,4001,4004,4007,4010,4012,4014,4017,4020,4023],{"class":335,"line":349},[333,3999,4000],{"class":427},"Fix:",[333,4002,4003],{"class":431}," Try",[333,4005,4006],{"class":431}," a",[333,4008,4009],{"class":431}," different",[333,4011,2932],{"class":431},[333,4013,1186],{"class":431},[333,4015,4016],{"class":431}," or",[333,4018,4019],{"class":431}," contact",[333,4021,4022],{"class":431}," your",[333,4024,4025],{"class":431}," bank\n",[411,4027,4029],{"id":4028},"parsing-errors-on-the-client","Parsing Errors on the Client",[303,4031,3340,4032,4035,4036,4038,4039,4042],{},[307,4033,4034],{},"parseError"," to extract the structured fields from any error, whether it's a fetch response, an ",[307,4037,3829],{},", or a plain ",[307,4040,4041],{},"Error"," object:",[323,4044,4049],{"className":4045,"code":4046,"filename":4047,"language":4048,"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,4050,4051,4060,4079,4083,4106,4113,4140,4156,4207,4213,4266,4281,4320,4325,4330,4335,4339],{"__ignoreMap":329},[333,4052,4053,4055,4058],{"class":335,"line":336},[333,4054,542],{"class":456},[333,4056,4057],{"class":431},"use client",[333,4059,476],{"class":456},[333,4061,4062,4064,4066,4069,4071,4073,4075,4077],{"class":335,"line":342},[333,4063,453],{"class":452},[333,4065,457],{"class":456},[333,4067,4068],{"class":460}," parseError",[333,4070,464],{"class":456},[333,4072,467],{"class":452},[333,4074,470],{"class":456},[333,4076,1879],{"class":431},[333,4078,476],{"class":456},[333,4080,4081],{"class":335,"line":349},[333,4082,346],{"emptyLinePlaceholder":345},[333,4084,4085,4087,4089,4092,4094,4097,4099,4102,4104],{"class":335,"line":355},[333,4086,608],{"class":488},[333,4088,1028],{"class":488},[333,4090,4091],{"class":519}," handleSubmit",[333,4093,522],{"class":456},[333,4095,4096],{"class":1140},"formData",[333,4098,534],{"class":456},[333,4100,4101],{"class":427}," FormData",[333,4103,1266],{"class":456},[333,4105,617],{"class":456},[333,4107,4108,4111],{"class":335,"line":361},[333,4109,4110],{"class":452},"  try",[333,4112,617],{"class":456},[333,4114,4115,4117,4120,4122,4124,4127,4129,4131,4134,4136,4138],{"class":335,"line":367},[333,4116,1075],{"class":488},[333,4118,4119],{"class":460}," res",[333,4121,516],{"class":456},[333,4123,1086],{"class":452},[333,4125,4126],{"class":519}," fetch",[333,4128,522],{"class":530},[333,4130,542],{"class":456},[333,4132,4133],{"class":431},"\u002Fapi\u002Fpayment\u002Fprocess",[333,4135,542],{"class":456},[333,4137,497],{"class":456},[333,4139,617],{"class":456},[333,4141,4142,4145,4147,4149,4152,4154],{"class":335,"line":373},[333,4143,4144],{"class":530},"      method",[333,4146,534],{"class":456},[333,4148,470],{"class":456},[333,4150,4151],{"class":431},"POST",[333,4153,542],{"class":456},[333,4155,545],{"class":456},[333,4157,4158,4161,4163,4166,4168,4170,4172,4174,4176,4178,4181,4183,4185,4187,4190,4192,4194,4196,4198,4201,4203,4205],{"class":335,"line":379},[333,4159,4160],{"class":530},"      body",[333,4162,534],{"class":456},[333,4164,4165],{"class":460}," JSON",[333,4167,639],{"class":456},[333,4169,1795],{"class":519},[333,4171,522],{"class":530},[333,4173,647],{"class":456},[333,4175,3477],{"class":530},[333,4177,534],{"class":456},[333,4179,4180],{"class":519}," Number",[333,4182,522],{"class":530},[333,4184,4096],{"class":460},[333,4186,639],{"class":456},[333,4188,4189],{"class":519},"get",[333,4191,522],{"class":530},[333,4193,542],{"class":456},[333,4195,3486],{"class":431},[333,4197,542],{"class":456},[333,4199,4200],{"class":530},")) ",[333,4202,513],{"class":456},[333,4204,1266],{"class":530},[333,4206,545],{"class":456},[333,4208,4209,4211],{"class":335,"line":385},[333,4210,3609],{"class":456},[333,4212,552],{"class":530},[333,4214,4215,4217,4219,4221,4224,4226,4229,4231,4234,4236,4239,4241,4243,4245,4247,4249,4251,4253,4255,4257,4259,4261,4263],{"class":335,"line":391},[333,4216,2498],{"class":452},[333,4218,1042],{"class":530},[333,4220,3235],{"class":456},[333,4222,4223],{"class":460},"res",[333,4225,639],{"class":456},[333,4227,4228],{"class":460},"ok",[333,4230,1068],{"class":530},[333,4232,4233],{"class":452},"throw",[333,4235,457],{"class":456},[333,4237,4238],{"class":530}," data",[333,4240,534],{"class":456},[333,4242,1086],{"class":452},[333,4244,4119],{"class":460},[333,4246,639],{"class":456},[333,4248,676],{"class":519},[333,4250,876],{"class":530},[333,4252,497],{"class":456},[333,4254,2245],{"class":530},[333,4256,534],{"class":456},[333,4258,4119],{"class":460},[333,4260,639],{"class":456},[333,4262,3889],{"class":460},[333,4264,4265],{"class":456}," }\n",[333,4267,4268,4270,4273,4275,4277,4279],{"class":335,"line":396},[333,4269,2831],{"class":456},[333,4271,4272],{"class":452}," catch",[333,4274,1042],{"class":530},[333,4276,1336],{"class":460},[333,4278,1068],{"class":530},[333,4280,525],{"class":456},[333,4282,4283,4285,4287,4289,4291,4293,4295,4298,4300,4303,4305,4308,4310,4312,4314,4316,4318],{"class":335,"line":402},[333,4284,1075],{"class":488},[333,4286,457],{"class":456},[333,4288,683],{"class":460},[333,4290,497],{"class":456},[333,4292,2245],{"class":460},[333,4294,497],{"class":456},[333,4296,4297],{"class":460}," why",[333,4299,497],{"class":456},[333,4301,4302],{"class":460}," fix",[333,4304,497],{"class":456},[333,4306,4307],{"class":460}," link",[333,4309,464],{"class":456},[333,4311,516],{"class":456},[333,4313,4068],{"class":519},[333,4315,522],{"class":530},[333,4317,1336],{"class":460},[333,4319,552],{"class":530},[333,4321,4322],{"class":335,"line":1271},[333,4323,4324],{"class":1529},"    \u002F\u002F message: \"Payment declined\"\n",[333,4326,4327],{"class":335,"line":1300},[333,4328,4329],{"class":1529},"    \u002F\u002F why: \"Card declined by issuer: insufficient_funds\"\n",[333,4331,4332],{"class":335,"line":1327},[333,4333,4334],{"class":1529},"    \u002F\u002F fix: \"Try a different payment method or contact your bank\"\n",[333,4336,4337],{"class":335,"line":1351},[333,4338,1112],{"class":456},[333,4340,4341],{"class":335,"line":1356},[333,4342,1117],{"class":456},[303,4344,4345,4347,4348,4351,4352,4355],{},[307,4346,4034],{}," normalizes any error shape into a flat ",[307,4349,4350],{},"{ message, status, why?, fix?, link? }"," object, so your UI code never has to dig through nested ",[307,4353,4354],{},"data.data"," or check for different error formats.",[407,4357,81],{"id":4358},"configuration-1",[725,4360,4362,4363,4366,4367,1734,4369,1734,4371,1734,4373,4375],{"color":727,"icon":4361},"i-lucide-book-open","See the ",[711,4364,4365],{"href":82},"Configuration reference"," for the full list of shared options (",[307,4368,1778],{},[307,4370,1786],{},[307,4372,1789],{},[307,4374,1792],{},", middleware options, etc.).",[303,4377,1772,4378,4380],{},[307,4379,309],{}," factory accepts the following options:",[1800,4382,4383,4395],{},[1803,4384,4385],{},[1806,4386,4387,4389,4391,4393],{},[1809,4388,1811],{},[1809,4390,1814],{},[1809,4392,1817],{},[1809,4394,1820],{},[1822,4396,4397,4415,4432,4452,4470,4489,4508,4527,4546,4564],{},[1806,4398,4399,4403,4407,4412],{},[1827,4400,4401],{},[307,4402,1781],{},[1827,4404,4405],{},[307,4406,1206],{},[1827,4408,4409],{},[307,4410,4411],{},"'app'",[1827,4413,4414],{},"Service name shown in logs",[1806,4416,4417,4422,4426,4429],{},[1827,4418,4419],{},[307,4420,4421],{},"environment",[1827,4423,4424],{},[307,4425,1206],{},[1827,4427,4428],{},"Auto-detected",[1827,4430,4431],{},"Environment name",[1806,4433,4434,4439,4444,4449],{},[1827,4435,4436],{},[307,4437,4438],{},"include",[1827,4440,4441],{},[307,4442,4443],{},"string[]",[1827,4445,4446],{},[307,4447,4448],{},"undefined",[1827,4450,4451],{},"Route patterns to log",[1806,4453,4454,4459,4463,4467],{},[1827,4455,4456],{},[307,4457,4458],{},"exclude",[1827,4460,4461],{},[307,4462,4443],{},[1827,4464,4465],{},[307,4466,4448],{},[1827,4468,4469],{},"Route patterns to exclude",[1806,4471,4472,4477,4482,4486],{},[1827,4473,4474],{},[307,4475,4476],{},"routes",[1827,4478,4479],{},[307,4480,4481],{},"Record\u003Cstring, RouteConfig>",[1827,4483,4484],{},[307,4485,4448],{},[1827,4487,4488],{},"Route-specific service configuration",[1806,4490,4491,4496,4501,4505],{},[1827,4492,4493],{},[307,4494,4495],{},"sampling.rates",[1827,4497,4498],{},[307,4499,4500],{},"object",[1827,4502,4503],{},[307,4504,4448],{},[1827,4506,4507],{},"Head sampling rates per log level",[1806,4509,4510,4515,4520,4524],{},[1827,4511,4512],{},[307,4513,4514],{},"sampling.keep",[1827,4516,4517],{},[307,4518,4519],{},"array",[1827,4521,4522],{},[307,4523,4448],{},[1827,4525,4526],{},"Tail sampling conditions",[1806,4528,4529,4534,4539,4543],{},[1827,4530,4531],{},[307,4532,4533],{},"keep",[1827,4535,4536],{},[307,4537,4538],{},"(ctx: TailSamplingContext) => void",[1827,4540,4541],{},[307,4542,4448],{},[1827,4544,4545],{},"Custom tail sampling callback",[1806,4547,4548,4552,4557,4561],{},[1827,4549,4550],{},[307,4551,771],{},[1827,4553,4554],{},[307,4555,4556],{},"DrainFunction",[1827,4558,4559],{},[307,4560,4448],{},[1827,4562,4563],{},"Drain adapter for external services",[1806,4565,4566,4571,4576,4580],{},[1827,4567,4568],{},[307,4569,4570],{},"enrich",[1827,4572,4573],{},[307,4574,4575],{},"(ctx: EnrichContext) => void",[1827,4577,4578],{},[307,4579,4448],{},[1827,4581,4582],{},"Event enrichment callback",[407,4584,4586],{"id":4585},"tail-sampling","Tail Sampling",[303,4588,4589],{},"Combine rule-based and custom tail sampling to always capture what matters, even when head sampling drops most logs:",[323,4591,4593],{"className":442,"code":4592,"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,4594,4595,4620,4634,4642,4661,4669,4684,4698,4716,4722,4726,4731,4747,4781,4805,4809],{"__ignoreMap":329},[333,4596,4597,4599,4601,4603,4605,4607,4610,4612,4614,4616,4618],{"class":335,"line":336},[333,4598,485],{"class":452},[333,4600,489],{"class":488},[333,4602,457],{"class":456},[333,4604,494],{"class":460},[333,4606,497],{"class":456},[333,4608,4609],{"class":460}," useLogger ",[333,4611,513],{"class":456},[333,4613,516],{"class":456},[333,4615,461],{"class":519},[333,4617,522],{"class":460},[333,4619,525],{"class":456},[333,4621,4622,4624,4626,4628,4630,4632],{"class":335,"line":342},[333,4623,531],{"class":530},[333,4625,534],{"class":456},[333,4627,470],{"class":456},[333,4629,539],{"class":431},[333,4631,542],{"class":456},[333,4633,545],{"class":456},[333,4635,4636,4638,4640],{"class":335,"line":349},[333,4637,2201],{"class":530},[333,4639,534],{"class":456},[333,4641,617],{"class":456},[333,4643,4644,4646,4648,4650,4652,4654,4656,4658],{"class":335,"line":355},[333,4645,2211],{"class":530},[333,4647,534],{"class":456},[333,4649,457],{"class":456},[333,4651,2218],{"class":530},[333,4653,534],{"class":456},[333,4655,2223],{"class":2043},[333,4657,2253],{"class":456},[333,4659,4660],{"class":1529}," \u002F\u002F Only keep 10% of info logs\n",[333,4662,4663,4665,4667],{"class":335,"line":361},[333,4664,2231],{"class":530},[333,4666,534],{"class":456},[333,4668,2236],{"class":460},[333,4670,4671,4673,4675,4677,4679,4681],{"class":335,"line":367},[333,4672,2242],{"class":456},[333,4674,2245],{"class":530},[333,4676,534],{"class":456},[333,4678,2250],{"class":2043},[333,4680,2253],{"class":456},[333,4682,4683],{"class":1529},"              \u002F\u002F Always keep 4xx\u002F5xx\n",[333,4685,4686,4688,4690,4692,4694,4696],{"class":335,"line":373},[333,4687,2242],{"class":456},[333,4689,2264],{"class":530},[333,4691,534],{"class":456},[333,4693,2269],{"class":2043},[333,4695,2253],{"class":456},[333,4697,2274],{"class":1529},[333,4699,4700,4702,4704,4706,4708,4710,4712,4714],{"class":335,"line":379},[333,4701,2242],{"class":456},[333,4703,1176],{"class":530},[333,4705,534],{"class":456},[333,4707,470],{"class":456},[333,4709,2288],{"class":431},[333,4711,542],{"class":456},[333,4713,2253],{"class":456},[333,4715,2295],{"class":1529},[333,4717,4718,4720],{"class":335,"line":385},[333,4719,2301],{"class":460},[333,4721,545],{"class":456},[333,4723,4724],{"class":335,"line":391},[333,4725,2309],{"class":456},[333,4727,4728],{"class":335,"line":396},[333,4729,4730],{"class":1529},"  \u002F\u002F Custom: always keep premium user requests\n",[333,4732,4733,4735,4737,4739,4741,4743,4745],{"class":335,"line":402},[333,4734,2435],{"class":519},[333,4736,534],{"class":456},[333,4738,1042],{"class":456},[333,4740,2442],{"class":1140},[333,4742,1266],{"class":456},[333,4744,614],{"class":488},[333,4746,617],{"class":456},[333,4748,4749,4751,4753,4755,4757,4759,4761,4763,4765,4767,4769,4771,4773,4775,4777,4779],{"class":335,"line":1271},[333,4750,1075],{"class":488},[333,4752,2456],{"class":460},[333,4754,516],{"class":456},[333,4756,2461],{"class":460},[333,4758,639],{"class":456},[333,4760,2466],{"class":460},[333,4762,639],{"class":456},[333,4764,2471],{"class":460},[333,4766,2474],{"class":452},[333,4768,457],{"class":456},[333,4770,2479],{"class":530},[333,4772,1151],{"class":456},[333,4774,2484],{"class":427},[333,4776,464],{"class":456},[333,4778,2489],{"class":456},[333,4780,2492],{"class":427},[333,4782,4783,4785,4787,4789,4791,4793,4795,4797,4799,4801,4803],{"class":335,"line":1300},[333,4784,2498],{"class":452},[333,4786,1042],{"class":530},[333,4788,2471],{"class":460},[333,4790,2505],{"class":456},[333,4792,2508],{"class":460},[333,4794,1068],{"class":530},[333,4796,2442],{"class":460},[333,4798,639],{"class":456},[333,4800,2517],{"class":460},[333,4802,516],{"class":456},[333,4804,2522],{"class":888},[333,4806,4807],{"class":335,"line":1327},[333,4808,2309],{"class":456},[333,4810,4811,4813],{"class":335,"line":1351},[333,4812,513],{"class":456},[333,4814,552],{"class":460},[303,4816,1772,4817,4819],{},[307,4818,4533],{}," rules use OR logic: any match forces the event through regardless of head sampling.",[407,4821,4823],{"id":4822},"middleware","Middleware",[303,4825,4826,4827,1385,4830,4833,4834,4836],{},"Set ",[307,4828,4829],{},"x-request-id",[307,4831,4832],{},"x-evlog-start"," headers so ",[307,4835,313],{}," can correlate timing across the middleware -> handler chain:",[323,4838,4841],{"className":442,"code":4839,"filename":4840,"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,4842,4843,4862,4866,4881,4885,4898,4919],{"__ignoreMap":329},[333,4844,4845,4847,4849,4852,4854,4856,4858,4860],{"class":335,"line":336},[333,4846,453],{"class":452},[333,4848,457],{"class":456},[333,4850,4851],{"class":460}," evlogMiddleware",[333,4853,464],{"class":456},[333,4855,467],{"class":452},[333,4857,470],{"class":456},[333,4859,473],{"class":431},[333,4861,476],{"class":456},[333,4863,4864],{"class":335,"line":342},[333,4865,346],{"emptyLinePlaceholder":345},[333,4867,4868,4870,4872,4875,4877,4879],{"class":335,"line":349},[333,4869,485],{"class":452},[333,4871,489],{"class":488},[333,4873,4874],{"class":460}," proxy ",[333,4876,601],{"class":456},[333,4878,4851],{"class":519},[333,4880,631],{"class":460},[333,4882,4883],{"class":335,"line":355},[333,4884,346],{"emptyLinePlaceholder":345},[333,4886,4887,4889,4891,4894,4896],{"class":335,"line":361},[333,4888,485],{"class":452},[333,4890,489],{"class":488},[333,4892,4893],{"class":460}," config ",[333,4895,601],{"class":456},[333,4897,617],{"class":456},[333,4899,4900,4903,4905,4907,4909,4912,4914,4917],{"class":335,"line":367},[333,4901,4902],{"class":530},"  matcher",[333,4904,534],{"class":456},[333,4906,1985],{"class":460},[333,4908,542],{"class":456},[333,4910,4911],{"class":431},"\u002Fapi\u002F:path*",[333,4913,542],{"class":456},[333,4915,4916],{"class":460},"]",[333,4918,545],{"class":456},[333,4920,4921],{"class":335,"line":373},[333,4922,1117],{"class":456},[725,4924,4925,4926,4929,4930,4932,4933,4935],{"color":727,"icon":13},"Older versions of Next.js use ",[307,4927,4928],{},"middleware.ts"," instead of ",[307,4931,4840],{},". The evlog middleware works with both, so just import from ",[307,4934,473],{}," regardless.",[407,4937,4939],{"id":4938},"server-actions","Server Actions",[303,4941,4942,4944],{},[307,4943,313],{}," also works with Server Actions. Wrap your action to get full request-scoped logging:",[323,4946,4949],{"className":442,"code":4947,"filename":4948,"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,4950,4951,4960,4982,4986,5017,5029,5081,5086],{"__ignoreMap":329},[333,4952,4953,4955,4958],{"class":335,"line":336},[333,4954,542],{"class":456},[333,4956,4957],{"class":431},"use server",[333,4959,476],{"class":456},[333,4961,4962,4964,4966,4968,4970,4972,4974,4976,4978,4980],{"class":335,"line":342},[333,4963,453],{"class":452},[333,4965,457],{"class":456},[333,4967,494],{"class":460},[333,4969,497],{"class":456},[333,4971,500],{"class":460},[333,4973,464],{"class":456},[333,4975,467],{"class":452},[333,4977,470],{"class":456},[333,4979,583],{"class":431},[333,4981,476],{"class":456},[333,4983,4984],{"class":335,"line":349},[333,4985,346],{"emptyLinePlaceholder":345},[333,4987,4988,4990,4992,4995,4997,4999,5001,5003,5005,5007,5009,5011,5013,5015],{"class":335,"line":355},[333,4989,485],{"class":452},[333,4991,489],{"class":488},[333,4993,4994],{"class":460}," checkout ",[333,4996,601],{"class":456},[333,4998,494],{"class":519},[333,5000,522],{"class":460},[333,5002,608],{"class":488},[333,5004,1042],{"class":456},[333,5006,4096],{"class":1140},[333,5008,534],{"class":456},[333,5010,4101],{"class":427},[333,5012,1266],{"class":456},[333,5014,614],{"class":488},[333,5016,617],{"class":456},[333,5018,5019,5021,5023,5025,5027],{"class":335,"line":361},[333,5020,622],{"class":488},[333,5022,505],{"class":460},[333,5024,516],{"class":456},[333,5026,500],{"class":519},[333,5028,631],{"class":530},[333,5030,5031,5033,5035,5037,5039,5041,5043,5045,5047,5050,5052,5054,5057,5059,5062,5064,5066,5068,5070,5073,5075,5077,5079],{"class":335,"line":367},[333,5032,636],{"class":460},[333,5034,639],{"class":456},[333,5036,642],{"class":519},[333,5038,522],{"class":530},[333,5040,647],{"class":456},[333,5042,650],{"class":530},[333,5044,534],{"class":456},[333,5046,470],{"class":456},[333,5048,5049],{"class":431},"checkout",[333,5051,542],{"class":456},[333,5053,497],{"class":456},[333,5055,5056],{"class":530}," cartId",[333,5058,534],{"class":456},[333,5060,5061],{"class":460}," formData",[333,5063,639],{"class":456},[333,5065,4189],{"class":519},[333,5067,522],{"class":530},[333,5069,542],{"class":456},[333,5071,5072],{"class":431},"cartId",[333,5074,542],{"class":456},[333,5076,1068],{"class":530},[333,5078,513],{"class":456},[333,5080,552],{"class":530},[333,5082,5083],{"class":335,"line":373},[333,5084,5085],{"class":1529},"  \u002F\u002F ...\n",[333,5087,5088,5090],{"class":335,"line":379},[333,5089,513],{"class":456},[333,5091,552],{"class":460},[407,5093,5095],{"id":5094},"client-provider","Client Provider",[303,5097,5098,5099,5102],{},"Wrap your root layout with ",[307,5100,5101],{},"EvlogProvider"," to enable client-side logging and transport:",[323,5104,5107],{"className":4045,"code":5105,"filename":5106,"language":4048,"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,5108,5109,5129,5133,5173,5180,5203,5212,5245,5255,5264,5273,5282,5287],{"__ignoreMap":329},[333,5110,5111,5113,5115,5118,5120,5122,5124,5127],{"class":335,"line":336},[333,5112,453],{"class":452},[333,5114,457],{"class":456},[333,5116,5117],{"class":460}," EvlogProvider",[333,5119,464],{"class":456},[333,5121,467],{"class":452},[333,5123,470],{"class":456},[333,5125,5126],{"class":431},"evlog\u002Fnext\u002Fclient",[333,5128,476],{"class":456},[333,5130,5131],{"class":335,"line":342},[333,5132,346],{"emptyLinePlaceholder":345},[333,5134,5135,5137,5140,5142,5145,5148,5151,5154,5156,5158,5160,5163,5165,5168,5171],{"class":335,"line":349},[333,5136,485],{"class":452},[333,5138,5139],{"class":452}," default",[333,5141,1028],{"class":488},[333,5143,5144],{"class":519}," Layout",[333,5146,5147],{"class":456},"({",[333,5149,5150],{"class":1140}," children",[333,5152,5153],{"class":456}," }:",[333,5155,457],{"class":456},[333,5157,5150],{"class":530},[333,5159,534],{"class":456},[333,5161,5162],{"class":427}," React",[333,5164,639],{"class":456},[333,5166,5167],{"class":427},"ReactNode",[333,5169,5170],{"class":456}," })",[333,5172,617],{"class":456},[333,5174,5175,5177],{"class":335,"line":355},[333,5176,668],{"class":452},[333,5178,5179],{"class":530}," (\n",[333,5181,5182,5185,5188,5191,5193,5195,5198,5200],{"class":335,"line":361},[333,5183,5184],{"class":456},"    \u003C",[333,5186,5187],{"class":530},"html",[333,5189,5190],{"class":488}," lang",[333,5192,601],{"class":456},[333,5194,3852],{"class":456},[333,5196,5197],{"class":431},"en",[333,5199,3852],{"class":456},[333,5201,5202],{"class":456},">\n",[333,5204,5205,5208,5210],{"class":335,"line":367},[333,5206,5207],{"class":456},"      \u003C",[333,5209,2944],{"class":530},[333,5211,5202],{"class":456},[333,5213,5214,5217,5219,5221,5223,5225,5227,5229,5232,5235,5238,5240,5242],{"class":335,"line":373},[333,5215,5216],{"class":456},"        \u003C",[333,5218,5101],{"class":427},[333,5220,2348],{"class":488},[333,5222,601],{"class":456},[333,5224,3852],{"class":456},[333,5226,539],{"class":431},[333,5228,3852],{"class":456},[333,5230,5231],{"class":488}," transport",[333,5233,5234],{"class":456},"={{",[333,5236,5237],{"class":530}," enabled",[333,5239,534],{"class":456},[333,5241,889],{"class":888},[333,5243,5244],{"class":456}," }}>\n",[333,5246,5247,5250,5253],{"class":335,"line":379},[333,5248,5249],{"class":456},"          {",[333,5251,5252],{"class":460},"children",[333,5254,1117],{"class":456},[333,5256,5257,5260,5262],{"class":335,"line":385},[333,5258,5259],{"class":456},"        \u003C\u002F",[333,5261,5101],{"class":427},[333,5263,5202],{"class":456},[333,5265,5266,5269,5271],{"class":335,"line":391},[333,5267,5268],{"class":456},"      \u003C\u002F",[333,5270,2944],{"class":530},[333,5272,5202],{"class":456},[333,5274,5275,5278,5280],{"class":335,"line":396},[333,5276,5277],{"class":456},"    \u003C\u002F",[333,5279,5187],{"class":530},[333,5281,5202],{"class":456},[333,5283,5284],{"class":335,"line":402},[333,5285,5286],{"class":530},"  )\n",[333,5288,5289],{"class":335,"line":1271},[333,5290,1117],{"class":456},[407,5292,56],{"id":5293},"client-logging",[303,5295,3340,5296,5299],{},[307,5297,5298],{},"log"," in any client component. Identity is preserved across all logs and transported to the server:",[323,5301,5304],{"className":4045,"code":5302,"filename":5303,"language":4048,"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,5305,5306,5314,5342,5346,5381,5386,5399,5424,5437,5453,5457,5463,5520,5525,5533,5537],{"__ignoreMap":329},[333,5307,5308,5310,5312],{"class":335,"line":336},[333,5309,542],{"class":456},[333,5311,4057],{"class":431},[333,5313,476],{"class":456},[333,5315,5316,5318,5320,5322,5324,5327,5329,5332,5334,5336,5338,5340],{"class":335,"line":342},[333,5317,453],{"class":452},[333,5319,457],{"class":456},[333,5321,505],{"class":460},[333,5323,497],{"class":456},[333,5325,5326],{"class":460}," setIdentity",[333,5328,497],{"class":456},[333,5330,5331],{"class":460}," clearIdentity",[333,5333,464],{"class":456},[333,5335,467],{"class":452},[333,5337,470],{"class":456},[333,5339,5126],{"class":431},[333,5341,476],{"class":456},[333,5343,5344],{"class":335,"line":349},[333,5345,346],{"emptyLinePlaceholder":345},[333,5347,5348,5350,5352,5355,5357,5359,5361,5363,5365,5367,5369,5371,5373,5375,5377,5379],{"class":335,"line":355},[333,5349,485],{"class":452},[333,5351,1028],{"class":488},[333,5353,5354],{"class":519}," Dashboard",[333,5356,5147],{"class":456},[333,5358,2456],{"class":1140},[333,5360,5153],{"class":456},[333,5362,457],{"class":456},[333,5364,2456],{"class":530},[333,5366,534],{"class":456},[333,5368,457],{"class":456},[333,5370,2801],{"class":530},[333,5372,534],{"class":456},[333,5374,1154],{"class":427},[333,5376,464],{"class":456},[333,5378,5170],{"class":456},[333,5380,617],{"class":456},[333,5382,5383],{"class":335,"line":361},[333,5384,5385],{"class":1529},"  \u002F\u002F Set identity once - all subsequent logs include it\n",[333,5387,5388,5391,5393,5395,5397],{"class":335,"line":367},[333,5389,5390],{"class":519},"  useEffect",[333,5392,522],{"class":530},[333,5394,876],{"class":456},[333,5396,614],{"class":488},[333,5398,617],{"class":456},[333,5400,5401,5404,5406,5408,5411,5413,5415,5417,5420,5422],{"class":335,"line":373},[333,5402,5403],{"class":519},"    setIdentity",[333,5405,522],{"class":530},[333,5407,647],{"class":456},[333,5409,5410],{"class":530}," userId",[333,5412,534],{"class":456},[333,5414,2456],{"class":460},[333,5416,639],{"class":456},[333,5418,5419],{"class":460},"id",[333,5421,464],{"class":456},[333,5423,552],{"class":530},[333,5425,5426,5429,5431,5433,5435],{"class":335,"line":379},[333,5427,5428],{"class":452},"    return",[333,5430,611],{"class":456},[333,5432,614],{"class":488},[333,5434,5331],{"class":519},[333,5436,631],{"class":530},[333,5438,5439,5442,5444,5446,5448,5450],{"class":335,"line":385},[333,5440,5441],{"class":456},"  },",[333,5443,1985],{"class":530},[333,5445,2471],{"class":460},[333,5447,639],{"class":456},[333,5449,5419],{"class":460},[333,5451,5452],{"class":530},"])\n",[333,5454,5455],{"class":335,"line":391},[333,5456,346],{"emptyLinePlaceholder":345},[333,5458,5459,5461],{"class":335,"line":396},[333,5460,668],{"class":452},[333,5462,5179],{"class":530},[333,5464,5465,5467,5470,5473,5476,5478,5480,5482,5484,5486,5488,5490,5492,5494,5497,5499,5501,5504,5506,5508,5511,5513,5515,5517],{"class":335,"line":402},[333,5466,5184],{"class":456},[333,5468,5469],{"class":530},"button",[333,5471,5472],{"class":488}," onClick",[333,5474,5475],{"class":456},"={()",[333,5477,614],{"class":488},[333,5479,505],{"class":460},[333,5481,639],{"class":456},[333,5483,727],{"class":519},[333,5485,522],{"class":460},[333,5487,647],{"class":456},[333,5489,650],{"class":530},[333,5491,534],{"class":456},[333,5493,470],{"class":456},[333,5495,5496],{"class":431},"export_clicked",[333,5498,542],{"class":456},[333,5500,497],{"class":456},[333,5502,5503],{"class":530}," format",[333,5505,534],{"class":456},[333,5507,470],{"class":456},[333,5509,5510],{"class":431},"csv",[333,5512,542],{"class":456},[333,5514,464],{"class":456},[333,5516,1266],{"class":460},[333,5518,5519],{"class":456},"}>\n",[333,5521,5522],{"class":335,"line":1271},[333,5523,5524],{"class":460},"      Export\n",[333,5526,5527,5529,5531],{"class":335,"line":1300},[333,5528,5277],{"class":456},[333,5530,5469],{"class":530},[333,5532,5202],{"class":456},[333,5534,5535],{"class":335,"line":1327},[333,5536,5286],{"class":530},[333,5538,5539],{"class":335,"line":1351},[333,5540,1117],{"class":456},[407,5542,5544],{"id":5543},"http-drain","HTTP drain",[303,5546,5547,5548,5550],{},"For advanced use cases, send structured ",[307,5549,2022],{}," events directly from the browser to a custom endpoint:",[323,5552,5555],{"className":442,"code":5553,"filename":5554,"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,5556,5557,5577,5581,5595,5617,5650,5656,5660,5667],{"__ignoreMap":329},[333,5558,5559,5561,5563,5566,5568,5570,5572,5575],{"class":335,"line":336},[333,5560,453],{"class":452},[333,5562,457],{"class":456},[333,5564,5565],{"class":460}," createHttpLogDrain",[333,5567,464],{"class":456},[333,5569,467],{"class":452},[333,5571,470],{"class":456},[333,5573,5574],{"class":431},"evlog\u002Fhttp",[333,5576,476],{"class":456},[333,5578,5579],{"class":335,"line":342},[333,5580,346],{"emptyLinePlaceholder":345},[333,5582,5583,5585,5587,5589,5591,5593],{"class":335,"line":349},[333,5584,1438],{"class":488},[333,5586,2076],{"class":460},[333,5588,601],{"class":456},[333,5590,5565],{"class":519},[333,5592,522],{"class":460},[333,5594,525],{"class":456},[333,5596,5597,5599,5601,5603,5606,5608,5610,5613,5615],{"class":335,"line":355},[333,5598,869],{"class":530},[333,5600,534],{"class":456},[333,5602,457],{"class":456},[333,5604,5605],{"class":530}," endpoint",[333,5607,534],{"class":456},[333,5609,470],{"class":456},[333,5611,5612],{"class":431},"\u002Fapi\u002Fevlog\u002Fhttp-ingest",[333,5614,542],{"class":456},[333,5616,1216],{"class":456},[333,5618,5619,5622,5624,5626,5628,5630,5632,5634,5636,5638,5640,5642,5644,5646,5648],{"class":335,"line":361},[333,5620,5621],{"class":530},"  pipeline",[333,5623,534],{"class":456},[333,5625,457],{"class":456},[333,5627,2031],{"class":530},[333,5629,534],{"class":456},[333,5631,457],{"class":456},[333,5633,2038],{"class":530},[333,5635,534],{"class":456},[333,5637,2223],{"class":2043},[333,5639,497],{"class":456},[333,5641,2049],{"class":530},[333,5643,534],{"class":456},[333,5645,2054],{"class":2043},[333,5647,464],{"class":456},[333,5649,1216],{"class":456},[333,5651,5652,5654],{"class":335,"line":367},[333,5653,513],{"class":456},[333,5655,552],{"class":460},[333,5657,5658],{"class":335,"line":373},[333,5659,346],{"emptyLinePlaceholder":345},[333,5661,5662,5664],{"class":335,"line":379},[333,5663,771],{"class":519},[333,5665,5666],{"class":460},"(drainEvent)\n",[333,5668,5669,5672,5675,5677,5680],{"class":335,"line":385},[333,5670,5671],{"class":452},"await",[333,5673,5674],{"class":460}," drain",[333,5676,639],{"class":456},[333,5678,5679],{"class":519},"flush",[333,5681,631],{"class":460},[303,5683,5684],{},"The server endpoint receives batched events:",[323,5686,5689],{"className":442,"code":5687,"filename":5688,"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,5690,5691,5714,5733,5738,5765],{"__ignoreMap":329},[333,5692,5693,5695,5697,5699,5702,5704,5706,5708,5710,5712],{"class":335,"line":336},[333,5694,485],{"class":452},[333,5696,1025],{"class":488},[333,5698,1028],{"class":488},[333,5700,5701],{"class":519}," POST",[333,5703,522],{"class":456},[333,5705,2726],{"class":1140},[333,5707,534],{"class":456},[333,5709,2731],{"class":427},[333,5711,1266],{"class":456},[333,5713,617],{"class":456},[333,5715,5716,5718,5721,5723,5725,5727,5729,5731],{"class":335,"line":342},[333,5717,622],{"class":488},[333,5719,5720],{"class":460}," events",[333,5722,516],{"class":456},[333,5724,1086],{"class":452},[333,5726,1341],{"class":460},[333,5728,639],{"class":456},[333,5730,676],{"class":519},[333,5732,631],{"class":530},[333,5734,5735],{"class":335,"line":349},[333,5736,5737],{"class":1529},"  \u002F\u002F Forward to your drain pipeline, Axiom, etc.\n",[333,5739,5740,5742,5745,5747,5749,5752,5754,5756,5758,5761,5763],{"class":335,"line":355},[333,5741,668],{"class":452},[333,5743,5744],{"class":456}," new",[333,5746,671],{"class":519},[333,5748,522],{"class":530},[333,5750,5751],{"class":456},"null,",[333,5753,457],{"class":456},[333,5755,2245],{"class":530},[333,5757,534],{"class":456},[333,5759,5760],{"class":2043}," 204",[333,5762,464],{"class":456},[333,5764,552],{"class":530},[333,5766,5767],{"class":335,"line":361},[333,5768,1117],{"class":456},[407,5770,5772],{"id":5771},"run-locally","Run Locally",[323,5774,5776],{"className":417,"code":5775,"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,5777,5778,5789,5797,5804],{"__ignoreMap":329},[333,5779,5780,5783,5786],{"class":335,"line":336},[333,5781,5782],{"class":427},"git",[333,5784,5785],{"class":431}," clone",[333,5787,5788],{"class":431}," https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog.git\n",[333,5790,5791,5794],{"class":335,"line":342},[333,5792,5793],{"class":519},"cd",[333,5795,5796],{"class":431}," evlog\u002Fexamples\u002Fnextjs\n",[333,5798,5799,5801],{"class":335,"line":349},[333,5800,428],{"class":427},[333,5802,5803],{"class":431}," install\n",[333,5805,5806,5808,5811],{"class":335,"line":355},[333,5807,428],{"class":427},[333,5809,5810],{"class":431}," run",[333,5812,5813],{"class":431}," dev\n",[303,5815,5816,5817,5821],{},"Open ",[711,5818,5819],{"href":5819,"rel":5820},"http:\u002F\u002Flocalhost:3000",[715]," to explore the example.",[5823,5824,5825],"card-group",{},[5826,5827,5831],"card",{"icon":5828,"title":5829,"to":5830},"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,5833,5835],{"id":5834},"next-steps","Next Steps",[303,5837,5838,5839,5841],{},"Deepen your ",[738,5840,130],{}," integration:",[732,5843,5844,5849,5854,5859],{},[735,5845,5846,5848],{},[711,5847,46],{"href":47},": Design comprehensive events with context layering",[735,5850,5851,5853],{},[711,5852,204],{"href":209},": Send logs to Axiom, Sentry, PostHog, and more",[735,5855,5856,5858],{},[711,5857,86],{"href":87},": Control log volume with head and tail sampling",[735,5860,5861,5863,5864,1734,5866,3351,5868,5870],{},[711,5862,51],{"href":52},": Throw errors with ",[307,5865,3347],{},[307,5867,3350],{},[307,5869,3354],{}," fields",[5872,5873,5874],"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":5876},[5877,5882,5888,5889,5890,5892,5895,5896,5897,5898,5899,5900,5901,5902,5903],{"id":409,"depth":342,"text":20,"children":5878},[5879,5880,5881],{"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":5883},[5884,5885,5886,5887],{"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":5891},"Background work (log.fork)",{"id":3336,"depth":342,"text":3337,"children":5893},[5894],{"id":4028,"depth":349,"text":4029},{"id":4358,"depth":342,"text":81},{"id":4585,"depth":342,"text":4586},{"id":4822,"depth":342,"text":4823},{"id":4938,"depth":342,"text":4939},{"id":5094,"depth":342,"text":5095},{"id":5293,"depth":342,"text":56},{"id":5543,"depth":342,"text":5544},{"id":5771,"depth":342,"text":5772},{"id":5834,"depth":342,"text":5835},"Wide events, structured errors, drain pipeline, tail sampling, route-based services, error handling, and client-side logging in Next.js applications.","md",[5907],{"label":5829,"icon":5828,"to":5830,"color":5908,"variant":5909},"neutral","subtle",{},{"title":130,"icon":133},{"title":130,"description":5904},"1Kt5jI--6673j1uOkvO5U1PAObx7G5NEALZrGgssz3g",[5915,5917],{"title":125,"path":126,"stem":127,"description":5916,"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":5918,"icon":138,"children":-1},"Automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in SvelteKit applications.",1776287859553]