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