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