[{"data":1,"prerenderedAt":3752},["ShallowReactive",2],{"navigation_docs":3,"-examples-nextjs":181,"-examples-nextjs-surround":3747},[4,30,55,105,122,136],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","/getting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","/getting-started/quick-start","1.getting-started/3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","/getting-started/agent-skills","1.getting-started/4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Core Concepts","/core-concepts","2.core-concepts",[35,40,45,50],{"title":36,"path":37,"stem":38,"icon":39},"Wide Events","/core-concepts/wide-events","2.core-concepts/1.wide-events","i-lucide-layers",{"title":41,"path":42,"stem":43,"icon":44},"Structured Errors","/core-concepts/structured-errors","2.core-concepts/2.structured-errors","i-lucide-shield-alert",{"title":46,"path":47,"stem":48,"icon":49},"Best Practices","/core-concepts/best-practices","2.core-concepts/3.best-practices","i-lucide-shield-check",{"title":51,"path":52,"stem":53,"icon":54},"Typed Fields","/core-concepts/typed-fields","2.core-concepts/4.typed-fields","i-simple-icons-typescript",{"title":56,"path":57,"stem":58,"children":59,"page":29},"Adapters","/adapters","3.adapters",[60,65,70,75,80,85,90,95,100],{"title":61,"path":62,"stem":63,"icon":64},"Overview","/adapters/overview","3.adapters/1.overview","i-custom-plug",{"title":66,"path":67,"stem":68,"icon":69},"Axiom","/adapters/axiom","3.adapters/2.axiom","i-custom-axiom",{"title":71,"path":72,"stem":73,"icon":74},"OTLP","/adapters/otlp","3.adapters/3.otlp","i-simple-icons-opentelemetry",{"title":76,"path":77,"stem":78,"icon":79},"PostHog","/adapters/posthog","3.adapters/4.posthog","i-simple-icons-posthog",{"title":81,"path":82,"stem":83,"icon":84},"Sentry","/adapters/sentry","3.adapters/5.sentry","i-simple-icons-sentry",{"title":86,"path":87,"stem":88,"icon":89},"Better Stack","/adapters/better-stack","3.adapters/6.better-stack","i-simple-icons-betterstack",{"title":91,"path":92,"stem":93,"icon":94},"Custom Adapters","/adapters/custom","3.adapters/7.custom","i-lucide-code",{"title":96,"path":97,"stem":98,"icon":99},"Pipeline","/adapters/pipeline","3.adapters/8.pipeline","i-lucide-workflow",{"title":101,"path":102,"stem":103,"icon":104},"Browser","/adapters/browser","3.adapters/9.browser","i-lucide-globe",{"title":106,"path":107,"stem":108,"children":109,"page":29},"Enrichers","/enrichers","4.enrichers",[110,113,118],{"title":61,"path":111,"stem":112,"icon":28},"/enrichers/overview","4.enrichers/1.overview",{"title":114,"path":115,"stem":116,"icon":117},"Built-in","/enrichers/built-in","4.enrichers/2.built-in","i-lucide-puzzle",{"title":119,"path":120,"stem":121,"icon":94},"Custom","/enrichers/custom","4.enrichers/3.custom",{"title":123,"path":124,"stem":125,"children":126,"page":29},"NuxtHub","/nuxthub","5.nuxthub",[127,131],{"title":61,"path":128,"stem":129,"icon":130},"/nuxthub/overview","5.nuxthub/1.overview","i-lucide-database",{"title":132,"path":133,"stem":134,"icon":135},"Retention","/nuxthub/retention","5.nuxthub/2.retention","i-lucide-clock",{"title":137,"path":138,"stem":139,"children":140,"page":29},"Examples","/examples","6.examples",[141,146,151,156,161,166,171,176],{"title":142,"path":143,"stem":144,"icon":145},"Next.js","/examples/nextjs","6.examples/1.nextjs","i-simple-icons-nextdotjs",{"title":147,"path":148,"stem":149,"icon":150},"TanStack Start","/examples/tanstack-start","6.examples/2.tanstack-start","i-custom-tanstack",{"title":152,"path":153,"stem":154,"icon":155},"Hono","/examples/hono","6.examples/3.hono","i-simple-icons-hono",{"title":157,"path":158,"stem":159,"icon":160},"Express","/examples/express","6.examples/4.express","i-simple-icons-express",{"title":162,"path":163,"stem":164,"icon":165},"Elysia","/examples/elysia","6.examples/5.elysia","i-custom-elysia",{"title":167,"path":168,"stem":169,"icon":170},"Fastify","/examples/fastify","6.examples/6.fastify","i-simple-icons-fastify",{"title":172,"path":173,"stem":174,"icon":175},"NestJS","/examples/nestjs","6.examples/7.nestjs","i-simple-icons-nestjs",{"title":177,"path":178,"stem":179,"icon":180},"SvelteKit","/examples/sveltekit","6.examples/7.sveltekit","i-simple-icons-svelte",{"id":182,"title":142,"body":183,"description":3737,"extension":3738,"links":3739,"meta":3743,"navigation":3744,"path":143,"seo":3745,"stem":144,"__hash__":3746},"docs/6.examples/1.nextjs.md",{"type":184,"value":185,"toc":3724},"minimark",[186,190,195,203,1099,1102,1105,1495,1498,1580,1584,1603,2074,2084,2210,2213,2280,2285,2298,2601,2614,2618,2621,2846,2853,2857,2871,2957,2972,2976,2983,3171,3175,3181,3425,3429,3435,3566,3569,3654,3658,3700,3710,3720],[187,188,189],"p",{},"Practical patterns for using evlog with Next.js (App Router). Each section shows how to activate a feature and the recommended way to use it.",[191,192,194],"h2",{"id":193},"production-configuration","Production Configuration",[187,196,197,198,202],{},"A real-world ",[199,200,201],"code",{},"lib/evlog.ts"," with enrichers, batched drain, tail sampling, and route-based service names:",[204,205,210],"pre",{"className":206,"code":207,"filename":201,"language":208,"meta":209,"style":209},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { DrainContext } from 'evlog'\nimport { createEvlog } from 'evlog/next'\nimport { createUserAgentEnricher, createRequestSizeEnricher } from 'evlog/enrichers'\nimport { createAxiomDrain } from 'evlog/axiom'\nimport { createDrainPipeline } from 'evlog/pipeline'\n\n// 1. Enrichers — add derived context to every event\nconst enrichers = [createUserAgentEnricher(), createRequestSizeEnricher()]\n\n// 2. Pipeline — batch events before sending\nconst pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 50, intervalMs: 5000 } })\n\n// 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  // 4. Head sampling — keep 10% of info logs\n  sampling: {\n    rates: { info: 10 },\n    keep: [\n      { status: 400 },              // Always keep errors\n      { duration: 1000 },           // Always keep slow requests\n      { path: '/api/critical/**' }, // Always keep critical paths\n    ],\n  },\n\n  // 5. Route-based service names\n  routes: {\n    '/api/auth/**': { service: 'auth-service' },\n    '/api/payment/**': { service: 'payment-service' },\n    '/api/booking/**': { service: 'booking-service' },\n  },\n\n  // 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  // 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","typescript","",[199,211,212,248,269,296,317,338,345,352,382,387,393,456,461,467,490,509,534,543,548,588,605,610,616,627,648,659,679,697,719,727,733,738,744,754,783,810,837,842,847,853,876,922,954,959,964,970,988,1018,1047,1074,1079,1084,1092],{"__ignoreMap":209},[213,214,217,221,224,228,232,235,238,241,245],"span",{"class":215,"line":216},"line",1,[213,218,220],{"class":219},"s7zQu","import",[213,222,223],{"class":219}," type",[213,225,227],{"class":226},"sMK4o"," {",[213,229,231],{"class":230},"sTEyZ"," DrainContext",[213,233,234],{"class":226}," }",[213,236,237],{"class":219}," from",[213,239,240],{"class":226}," '",[213,242,244],{"class":243},"sfazB","evlog",[213,246,247],{"class":226},"'\n",[213,249,251,253,255,258,260,262,264,267],{"class":215,"line":250},2,[213,252,220],{"class":219},[213,254,227],{"class":226},[213,256,257],{"class":230}," createEvlog",[213,259,234],{"class":226},[213,261,237],{"class":219},[213,263,240],{"class":226},[213,265,266],{"class":243},"evlog/next",[213,268,247],{"class":226},[213,270,272,274,276,279,282,285,287,289,291,294],{"class":215,"line":271},3,[213,273,220],{"class":219},[213,275,227],{"class":226},[213,277,278],{"class":230}," createUserAgentEnricher",[213,280,281],{"class":226},",",[213,283,284],{"class":230}," createRequestSizeEnricher",[213,286,234],{"class":226},[213,288,237],{"class":219},[213,290,240],{"class":226},[213,292,293],{"class":243},"evlog/enrichers",[213,295,247],{"class":226},[213,297,299,301,303,306,308,310,312,315],{"class":215,"line":298},4,[213,300,220],{"class":219},[213,302,227],{"class":226},[213,304,305],{"class":230}," createAxiomDrain",[213,307,234],{"class":226},[213,309,237],{"class":219},[213,311,240],{"class":226},[213,313,314],{"class":243},"evlog/axiom",[213,316,247],{"class":226},[213,318,320,322,324,327,329,331,333,336],{"class":215,"line":319},5,[213,321,220],{"class":219},[213,323,227],{"class":226},[213,325,326],{"class":230}," createDrainPipeline",[213,328,234],{"class":226},[213,330,237],{"class":219},[213,332,240],{"class":226},[213,334,335],{"class":243},"evlog/pipeline",[213,337,247],{"class":226},[213,339,341],{"class":215,"line":340},6,[213,342,344],{"emptyLinePlaceholder":343},true,"\n",[213,346,348],{"class":215,"line":347},7,[213,349,351],{"class":350},"sHwdD","// 1. Enrichers — add derived context to every event\n",[213,353,355,359,362,365,368,372,375,377,379],{"class":215,"line":354},8,[213,356,358],{"class":357},"spNyl","const",[213,360,361],{"class":230}," enrichers ",[213,363,364],{"class":226},"=",[213,366,367],{"class":230}," [",[213,369,371],{"class":370},"s2Zo4","createUserAgentEnricher",[213,373,374],{"class":230},"()",[213,376,281],{"class":226},[213,378,284],{"class":370},[213,380,381],{"class":230},"()]\n",[213,383,385],{"class":215,"line":384},9,[213,386,344],{"emptyLinePlaceholder":343},[213,388,390],{"class":215,"line":389},10,[213,391,392],{"class":350},"// 2. Pipeline — batch events before sending\n",[213,394,396,398,401,403,405,408,412,415,418,421,425,428,430,433,435,439,441,444,446,449,451,453],{"class":215,"line":395},11,[213,397,358],{"class":357},[213,399,400],{"class":230}," pipeline ",[213,402,364],{"class":226},[213,404,326],{"class":370},[213,406,407],{"class":226},"\u003C",[213,409,411],{"class":410},"sBMFI","DrainContext",[213,413,414],{"class":226},">",[213,416,417],{"class":230},"(",[213,419,420],{"class":226},"{",[213,422,424],{"class":423},"swJcz"," batch",[213,426,427],{"class":226},":",[213,429,227],{"class":226},[213,431,432],{"class":423}," size",[213,434,427],{"class":226},[213,436,438],{"class":437},"sbssI"," 50",[213,440,281],{"class":226},[213,442,443],{"class":423}," intervalMs",[213,445,427],{"class":226},[213,447,448],{"class":437}," 5000",[213,450,234],{"class":226},[213,452,234],{"class":226},[213,454,455],{"class":230},")\n",[213,457,459],{"class":215,"line":458},12,[213,460,344],{"emptyLinePlaceholder":343},[213,462,464],{"class":215,"line":463},13,[213,465,466],{"class":350},"// 3. Drain — send batched events to Axiom\n",[213,468,470,472,475,477,480,482,485,487],{"class":215,"line":469},14,[213,471,358],{"class":357},[213,473,474],{"class":230}," drain ",[213,476,364],{"class":226},[213,478,479],{"class":370}," pipeline",[213,481,417],{"class":230},[213,483,484],{"class":370},"createAxiomDrain",[213,486,417],{"class":230},[213,488,489],{"class":226},"{\n",[213,491,493,496,498,500,503,506],{"class":215,"line":492},15,[213,494,495],{"class":423},"  dataset",[213,497,427],{"class":226},[213,499,240],{"class":226},[213,501,502],{"class":243},"logs",[213,504,505],{"class":226},"'",[213,507,508],{"class":226},",\n",[213,510,512,515,517,520,523,526,528,531],{"class":215,"line":511},16,[213,513,514],{"class":423},"  token",[213,516,427],{"class":226},[213,518,519],{"class":230}," process",[213,521,522],{"class":226},".",[213,524,525],{"class":230},"env",[213,527,522],{"class":226},[213,529,530],{"class":230},"AXIOM_TOKEN",[213,532,533],{"class":226},"!,\n",[213,535,537,540],{"class":215,"line":536},17,[213,538,539],{"class":226},"}",[213,541,542],{"class":230},"))\n",[213,544,546],{"class":215,"line":545},18,[213,547,344],{"emptyLinePlaceholder":343},[213,549,551,554,557,559,562,564,567,569,572,574,577,579,582,584,586],{"class":215,"line":550},19,[213,552,553],{"class":219},"export",[213,555,556],{"class":357}," const",[213,558,227],{"class":226},[213,560,561],{"class":230}," withEvlog",[213,563,281],{"class":226},[213,565,566],{"class":230}," useLogger",[213,568,281],{"class":226},[213,570,571],{"class":230}," log",[213,573,281],{"class":226},[213,575,576],{"class":230}," createError ",[213,578,539],{"class":226},[213,580,581],{"class":226}," =",[213,583,257],{"class":370},[213,585,417],{"class":230},[213,587,489],{"class":226},[213,589,591,594,596,598,601,603],{"class":215,"line":590},20,[213,592,593],{"class":423},"  service",[213,595,427],{"class":226},[213,597,240],{"class":226},[213,599,600],{"class":243},"my-app",[213,602,505],{"class":226},[213,604,508],{"class":226},[213,606,608],{"class":215,"line":607},21,[213,609,344],{"emptyLinePlaceholder":343},[213,611,613],{"class":215,"line":612},22,[213,614,615],{"class":350},"  // 4. Head sampling — keep 10% of info logs\n",[213,617,619,622,624],{"class":215,"line":618},23,[213,620,621],{"class":423},"  sampling",[213,623,427],{"class":226},[213,625,626],{"class":226}," {\n",[213,628,630,633,635,637,640,642,645],{"class":215,"line":629},24,[213,631,632],{"class":423},"    rates",[213,634,427],{"class":226},[213,636,227],{"class":226},[213,638,639],{"class":423}," info",[213,641,427],{"class":226},[213,643,644],{"class":437}," 10",[213,646,647],{"class":226}," },\n",[213,649,651,654,656],{"class":215,"line":650},25,[213,652,653],{"class":423},"    keep",[213,655,427],{"class":226},[213,657,658],{"class":230}," [\n",[213,660,662,665,668,670,673,676],{"class":215,"line":661},26,[213,663,664],{"class":226},"      {",[213,666,667],{"class":423}," status",[213,669,427],{"class":226},[213,671,672],{"class":437}," 400",[213,674,675],{"class":226}," },",[213,677,678],{"class":350},"              // Always keep errors\n",[213,680,682,684,687,689,692,694],{"class":215,"line":681},27,[213,683,664],{"class":226},[213,685,686],{"class":423}," duration",[213,688,427],{"class":226},[213,690,691],{"class":437}," 1000",[213,693,675],{"class":226},[213,695,696],{"class":350},"           // Always keep slow requests\n",[213,698,700,702,705,707,709,712,714,716],{"class":215,"line":699},28,[213,701,664],{"class":226},[213,703,704],{"class":423}," path",[213,706,427],{"class":226},[213,708,240],{"class":226},[213,710,711],{"class":243},"/api/critical/**",[213,713,505],{"class":226},[213,715,675],{"class":226},[213,717,718],{"class":350}," // Always keep critical paths\n",[213,720,722,725],{"class":215,"line":721},29,[213,723,724],{"class":230},"    ]",[213,726,508],{"class":226},[213,728,730],{"class":215,"line":729},30,[213,731,732],{"class":226},"  },\n",[213,734,736],{"class":215,"line":735},31,[213,737,344],{"emptyLinePlaceholder":343},[213,739,741],{"class":215,"line":740},32,[213,742,743],{"class":350},"  // 5. Route-based service names\n",[213,745,747,750,752],{"class":215,"line":746},33,[213,748,749],{"class":423},"  routes",[213,751,427],{"class":226},[213,753,626],{"class":226},[213,755,757,760,763,765,767,769,772,774,776,779,781],{"class":215,"line":756},34,[213,758,759],{"class":226},"    '",[213,761,762],{"class":423},"/api/auth/**",[213,764,505],{"class":226},[213,766,427],{"class":226},[213,768,227],{"class":226},[213,770,771],{"class":423}," service",[213,773,427],{"class":226},[213,775,240],{"class":226},[213,777,778],{"class":243},"auth-service",[213,780,505],{"class":226},[213,782,647],{"class":226},[213,784,786,788,791,793,795,797,799,801,803,806,808],{"class":215,"line":785},35,[213,787,759],{"class":226},[213,789,790],{"class":423},"/api/payment/**",[213,792,505],{"class":226},[213,794,427],{"class":226},[213,796,227],{"class":226},[213,798,771],{"class":423},[213,800,427],{"class":226},[213,802,240],{"class":226},[213,804,805],{"class":243},"payment-service",[213,807,505],{"class":226},[213,809,647],{"class":226},[213,811,813,815,818,820,822,824,826,828,830,833,835],{"class":215,"line":812},36,[213,814,759],{"class":226},[213,816,817],{"class":423},"/api/booking/**",[213,819,505],{"class":226},[213,821,427],{"class":226},[213,823,227],{"class":226},[213,825,771],{"class":423},[213,827,427],{"class":226},[213,829,240],{"class":226},[213,831,832],{"class":243},"booking-service",[213,834,505],{"class":226},[213,836,647],{"class":226},[213,838,840],{"class":215,"line":839},37,[213,841,732],{"class":226},[213,843,845],{"class":215,"line":844},38,[213,846,344],{"emptyLinePlaceholder":343},[213,848,850],{"class":215,"line":849},39,[213,851,852],{"class":350},"  // 6. Custom tail sampling — business logic\n",[213,854,856,859,861,864,868,871,874],{"class":215,"line":855},40,[213,857,858],{"class":370},"  keep",[213,860,427],{"class":226},[213,862,863],{"class":226}," (",[213,865,867],{"class":866},"sHdIc","ctx",[213,869,870],{"class":226},")",[213,872,873],{"class":357}," =>",[213,875,626],{"class":226},[213,877,879,882,885,887,890,892,895,897,900,903,905,908,911,914,916,919],{"class":215,"line":878},41,[213,880,881],{"class":357},"    const",[213,883,884],{"class":230}," user",[213,886,581],{"class":226},[213,888,889],{"class":230}," ctx",[213,891,522],{"class":226},[213,893,894],{"class":230},"context",[213,896,522],{"class":226},[213,898,899],{"class":230},"user",[213,901,902],{"class":219}," as",[213,904,227],{"class":226},[213,906,907],{"class":423}," premium",[213,909,910],{"class":226},"?:",[213,912,913],{"class":410}," boolean",[213,915,234],{"class":226},[213,917,918],{"class":226}," |",[213,920,921],{"class":410}," undefined\n",[213,923,925,928,930,932,935,938,941,943,945,948,950],{"class":215,"line":924},42,[213,926,927],{"class":219},"    if",[213,929,863],{"class":423},[213,931,899],{"class":230},[213,933,934],{"class":226},"?.",[213,936,937],{"class":230},"premium",[213,939,940],{"class":423},") ",[213,942,867],{"class":230},[213,944,522],{"class":226},[213,946,947],{"class":230},"shouldKeep",[213,949,581],{"class":226},[213,951,953],{"class":952},"sfNiH"," true\n",[213,955,957],{"class":215,"line":956},43,[213,958,732],{"class":226},[213,960,962],{"class":215,"line":961},44,[213,963,344],{"emptyLinePlaceholder":343},[213,965,967],{"class":215,"line":966},45,[213,968,969],{"class":350},"  // 7. Enrich every event with user agent, request size, and deployment info\n",[213,971,973,976,978,980,982,984,986],{"class":215,"line":972},46,[213,974,975],{"class":370},"  enrich",[213,977,427],{"class":226},[213,979,863],{"class":226},[213,981,867],{"class":866},[213,983,870],{"class":226},[213,985,873],{"class":357},[213,987,626],{"class":226},[213,989,991,994,996,998,1001,1004,1007,1009,1012,1014,1016],{"class":215,"line":990},47,[213,992,993],{"class":219},"    for",[213,995,863],{"class":423},[213,997,358],{"class":357},[213,999,1000],{"class":230}," enricher",[213,1002,1003],{"class":226}," of",[213,1005,1006],{"class":230}," enrichers",[213,1008,940],{"class":423},[213,1010,1011],{"class":370},"enricher",[213,1013,417],{"class":423},[213,1015,867],{"class":230},[213,1017,455],{"class":423},[213,1019,1021,1024,1026,1029,1031,1034,1036,1038,1040,1042,1044],{"class":215,"line":1020},48,[213,1022,1023],{"class":230},"    ctx",[213,1025,522],{"class":226},[213,1027,1028],{"class":230},"event",[213,1030,522],{"class":226},[213,1032,1033],{"class":230},"deploymentId",[213,1035,581],{"class":226},[213,1037,519],{"class":230},[213,1039,522],{"class":226},[213,1041,525],{"class":230},[213,1043,522],{"class":226},[213,1045,1046],{"class":230},"VERCEL_DEPLOYMENT_ID\n",[213,1048,1050,1052,1054,1056,1058,1061,1063,1065,1067,1069,1071],{"class":215,"line":1049},49,[213,1051,1023],{"class":230},[213,1053,522],{"class":226},[213,1055,1028],{"class":230},[213,1057,522],{"class":226},[213,1059,1060],{"class":230},"region",[213,1062,581],{"class":226},[213,1064,519],{"class":230},[213,1066,522],{"class":226},[213,1068,525],{"class":230},[213,1070,522],{"class":226},[213,1072,1073],{"class":230},"VERCEL_REGION\n",[213,1075,1077],{"class":215,"line":1076},50,[213,1078,732],{"class":226},[213,1080,1082],{"class":215,"line":1081},51,[213,1083,344],{"emptyLinePlaceholder":343},[213,1085,1087,1090],{"class":215,"line":1086},52,[213,1088,1089],{"class":230},"  drain",[213,1091,508],{"class":226},[213,1093,1095,1097],{"class":215,"line":1094},53,[213,1096,539],{"class":226},[213,1098,455],{"class":230},[191,1100,36],{"id":1101},"wide-events",[187,1103,1104],{},"Build up context progressively through your handler. One request = one wide event:",[204,1106,1109],{"className":206,"code":1107,"filename":1108,"language":208,"meta":209,"style":209},"import { withEvlog, useLogger } from '@/lib/evlog'\n\nexport const POST = withEvlog(async (request: Request) => {\n  const log = useLogger()\n  const body = await request.json()\n\n  // Stage 1: User context\n  log.set({\n    user: { id: body.userId, plan: 'enterprise' },\n  })\n\n  // Stage 2: Cart context\n  log.set({\n    cart: { items: body.items.length, total: body.total, currency: 'USD' },\n  })\n\n  // 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/api/checkout/route.ts",[199,1110,1111,1134,1138,1172,1186,1208,1212,1217,1231,1268,1275,1279,1284,1296,1352,1358,1362,1367,1388,1400,1437,1443,1447,1489],{"__ignoreMap":209},[213,1112,1113,1115,1117,1119,1121,1123,1125,1127,1129,1132],{"class":215,"line":216},[213,1114,220],{"class":219},[213,1116,227],{"class":226},[213,1118,561],{"class":230},[213,1120,281],{"class":226},[213,1122,566],{"class":230},[213,1124,234],{"class":226},[213,1126,237],{"class":219},[213,1128,240],{"class":226},[213,1130,1131],{"class":243},"@/lib/evlog",[213,1133,247],{"class":226},[213,1135,1136],{"class":215,"line":250},[213,1137,344],{"emptyLinePlaceholder":343},[213,1139,1140,1142,1144,1147,1149,1151,1153,1156,1158,1161,1163,1166,1168,1170],{"class":215,"line":271},[213,1141,553],{"class":219},[213,1143,556],{"class":357},[213,1145,1146],{"class":230}," POST ",[213,1148,364],{"class":226},[213,1150,561],{"class":370},[213,1152,417],{"class":230},[213,1154,1155],{"class":357},"async",[213,1157,863],{"class":226},[213,1159,1160],{"class":866},"request",[213,1162,427],{"class":226},[213,1164,1165],{"class":410}," Request",[213,1167,870],{"class":226},[213,1169,873],{"class":357},[213,1171,626],{"class":226},[213,1173,1174,1177,1179,1181,1183],{"class":215,"line":298},[213,1175,1176],{"class":357},"  const",[213,1178,571],{"class":230},[213,1180,581],{"class":226},[213,1182,566],{"class":370},[213,1184,1185],{"class":423},"()\n",[213,1187,1188,1190,1193,1195,1198,1201,1203,1206],{"class":215,"line":319},[213,1189,1176],{"class":357},[213,1191,1192],{"class":230}," body",[213,1194,581],{"class":226},[213,1196,1197],{"class":219}," await",[213,1199,1200],{"class":230}," request",[213,1202,522],{"class":226},[213,1204,1205],{"class":370},"json",[213,1207,1185],{"class":423},[213,1209,1210],{"class":215,"line":340},[213,1211,344],{"emptyLinePlaceholder":343},[213,1213,1214],{"class":215,"line":347},[213,1215,1216],{"class":350},"  // Stage 1: User context\n",[213,1218,1219,1222,1224,1227,1229],{"class":215,"line":354},[213,1220,1221],{"class":230},"  log",[213,1223,522],{"class":226},[213,1225,1226],{"class":370},"set",[213,1228,417],{"class":423},[213,1230,489],{"class":226},[213,1232,1233,1236,1238,1240,1243,1245,1247,1249,1252,1254,1257,1259,1261,1264,1266],{"class":215,"line":384},[213,1234,1235],{"class":423},"    user",[213,1237,427],{"class":226},[213,1239,227],{"class":226},[213,1241,1242],{"class":423}," id",[213,1244,427],{"class":226},[213,1246,1192],{"class":230},[213,1248,522],{"class":226},[213,1250,1251],{"class":230},"userId",[213,1253,281],{"class":226},[213,1255,1256],{"class":423}," plan",[213,1258,427],{"class":226},[213,1260,240],{"class":226},[213,1262,1263],{"class":243},"enterprise",[213,1265,505],{"class":226},[213,1267,647],{"class":226},[213,1269,1270,1273],{"class":215,"line":389},[213,1271,1272],{"class":226},"  }",[213,1274,455],{"class":423},[213,1276,1277],{"class":215,"line":395},[213,1278,344],{"emptyLinePlaceholder":343},[213,1280,1281],{"class":215,"line":458},[213,1282,1283],{"class":350},"  // Stage 2: Cart context\n",[213,1285,1286,1288,1290,1292,1294],{"class":215,"line":463},[213,1287,1221],{"class":230},[213,1289,522],{"class":226},[213,1291,1226],{"class":370},[213,1293,417],{"class":423},[213,1295,489],{"class":226},[213,1297,1298,1301,1303,1305,1308,1310,1312,1314,1317,1319,1322,1324,1327,1329,1331,1333,1336,1338,1341,1343,1345,1348,1350],{"class":215,"line":469},[213,1299,1300],{"class":423},"    cart",[213,1302,427],{"class":226},[213,1304,227],{"class":226},[213,1306,1307],{"class":423}," items",[213,1309,427],{"class":226},[213,1311,1192],{"class":230},[213,1313,522],{"class":226},[213,1315,1316],{"class":230},"items",[213,1318,522],{"class":226},[213,1320,1321],{"class":230},"length",[213,1323,281],{"class":226},[213,1325,1326],{"class":423}," total",[213,1328,427],{"class":226},[213,1330,1192],{"class":230},[213,1332,522],{"class":226},[213,1334,1335],{"class":230},"total",[213,1337,281],{"class":226},[213,1339,1340],{"class":423}," currency",[213,1342,427],{"class":226},[213,1344,240],{"class":226},[213,1346,1347],{"class":243},"USD",[213,1349,505],{"class":226},[213,1351,647],{"class":226},[213,1353,1354,1356],{"class":215,"line":492},[213,1355,1272],{"class":226},[213,1357,455],{"class":423},[213,1359,1360],{"class":215,"line":511},[213,1361,344],{"emptyLinePlaceholder":343},[213,1363,1364],{"class":215,"line":536},[213,1365,1366],{"class":350},"  // Stage 3: Payment context\n",[213,1368,1369,1371,1374,1376,1378,1381,1383,1386],{"class":215,"line":545},[213,1370,1176],{"class":357},[213,1372,1373],{"class":230}," payment",[213,1375,581],{"class":226},[213,1377,1197],{"class":219},[213,1379,1380],{"class":370}," processPayment",[213,1382,417],{"class":423},[213,1384,1385],{"class":230},"body",[213,1387,455],{"class":423},[213,1389,1390,1392,1394,1396,1398],{"class":215,"line":550},[213,1391,1221],{"class":230},[213,1393,522],{"class":226},[213,1395,1226],{"class":370},[213,1397,417],{"class":423},[213,1399,489],{"class":226},[213,1401,1402,1405,1407,1409,1412,1414,1416,1418,1421,1423,1426,1428,1430,1432,1435],{"class":215,"line":590},[213,1403,1404],{"class":423},"    payment",[213,1406,427],{"class":226},[213,1408,227],{"class":226},[213,1410,1411],{"class":423}," method",[213,1413,427],{"class":226},[213,1415,1373],{"class":230},[213,1417,522],{"class":226},[213,1419,1420],{"class":230},"method",[213,1422,281],{"class":226},[213,1424,1425],{"class":423}," cardLast4",[213,1427,427],{"class":226},[213,1429,1373],{"class":230},[213,1431,522],{"class":226},[213,1433,1434],{"class":230},"last4",[213,1436,647],{"class":226},[213,1438,1439,1441],{"class":215,"line":607},[213,1440,1272],{"class":226},[213,1442,455],{"class":423},[213,1444,1445],{"class":215,"line":612},[213,1446,344],{"emptyLinePlaceholder":343},[213,1448,1449,1452,1455,1457,1459,1461,1463,1466,1468,1471,1473,1476,1478,1480,1482,1485,1487],{"class":215,"line":618},[213,1450,1451],{"class":219},"  return",[213,1453,1454],{"class":230}," Response",[213,1456,522],{"class":226},[213,1458,1205],{"class":370},[213,1460,417],{"class":423},[213,1462,420],{"class":226},[213,1464,1465],{"class":423}," success",[213,1467,427],{"class":226},[213,1469,1470],{"class":952}," true",[213,1472,281],{"class":226},[213,1474,1475],{"class":423}," orderId",[213,1477,427],{"class":226},[213,1479,1373],{"class":230},[213,1481,522],{"class":226},[213,1483,1484],{"class":230},"orderId",[213,1486,234],{"class":226},[213,1488,455],{"class":423},[213,1490,1491,1493],{"class":215,"line":629},[213,1492,539],{"class":226},[213,1494,455],{"class":230},[187,1496,1497],{},"All fields are merged into a single wide event emitted when the handler completes:",[204,1499,1504],{"className":1500,"code":1501,"filename":1502,"language":1503,"meta":209,"style":209},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","10:23:45.612 INFO [my-app] POST /api/checkout 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)","bash",[199,1505,1506,1517,1531,1553,1569],{"__ignoreMap":209},[213,1507,1508,1511,1514],{"class":215,"line":216},[213,1509,1510],{"class":410},"10:23:45.612",[213,1512,1513],{"class":243}," INFO",[213,1515,1516],{"class":230}," [my-app] POST /api/checkout 200 in 145ms\n",[213,1518,1519,1522,1525,1528],{"class":215,"line":250},[213,1520,1521],{"class":410},"  ├─",[213,1523,1524],{"class":243}," user:",[213,1526,1527],{"class":243}," id=usr_123",[213,1529,1530],{"class":243}," plan=enterprise\n",[213,1532,1533,1535,1538,1541,1544,1547,1550],{"class":215,"line":271},[213,1534,1521],{"class":410},[213,1536,1537],{"class":243}," cart:",[213,1539,1540],{"class":243}," items=",[213,1542,1543],{"class":437},"3",[213,1545,1546],{"class":243}," total=",[213,1548,1549],{"class":437},"14999",[213,1551,1552],{"class":243}," currency=USD\n",[213,1554,1555,1557,1560,1563,1566],{"class":215,"line":298},[213,1556,1521],{"class":410},[213,1558,1559],{"class":243}," payment:",[213,1561,1562],{"class":243}," method=card",[213,1564,1565],{"class":243}," cardLast4=",[213,1567,1568],{"class":437},"4242\n",[213,1570,1571,1574,1577],{"class":215,"line":319},[213,1572,1573],{"class":410},"  └─",[213,1575,1576],{"class":243}," requestId:",[213,1578,1579],{"class":243}," a1b2c3d4-...\n",[191,1581,1583],{"id":1582},"error-handling","Error Handling",[187,1585,1586,1587,1590,1591,1594,1595,1598,1599,1602],{},"Use ",[199,1588,1589],{},"createError"," for structured errors with ",[199,1592,1593],{},"why",", ",[199,1596,1597],{},"fix",", and ",[199,1600,1601],{},"link"," fields that help developers debug in both logs and API responses:",[204,1604,1607],{"className":206,"code":1605,"filename":1606,"language":208,"meta":209,"style":209},"import { withEvlog, useLogger, createError } from '@/lib/evlog'\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://docs.example.com/api/payments#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/api/payment/process/route.ts",[199,1608,1609,1636,1640,1670,1682,1700,1704,1740,1744,1767,1778,1789,1805,1821,1837,1853,1860,1865,1869,1889,1893,1914,1955,1965,1976,1991,2015,2030,2036,2040,2044,2068],{"__ignoreMap":209},[213,1610,1611,1613,1615,1617,1619,1621,1623,1626,1628,1630,1632,1634],{"class":215,"line":216},[213,1612,220],{"class":219},[213,1614,227],{"class":226},[213,1616,561],{"class":230},[213,1618,281],{"class":226},[213,1620,566],{"class":230},[213,1622,281],{"class":226},[213,1624,1625],{"class":230}," createError",[213,1627,234],{"class":226},[213,1629,237],{"class":219},[213,1631,240],{"class":226},[213,1633,1131],{"class":243},[213,1635,247],{"class":226},[213,1637,1638],{"class":215,"line":250},[213,1639,344],{"emptyLinePlaceholder":343},[213,1641,1642,1644,1646,1648,1650,1652,1654,1656,1658,1660,1662,1664,1666,1668],{"class":215,"line":271},[213,1643,553],{"class":219},[213,1645,556],{"class":357},[213,1647,1146],{"class":230},[213,1649,364],{"class":226},[213,1651,561],{"class":370},[213,1653,417],{"class":230},[213,1655,1155],{"class":357},[213,1657,863],{"class":226},[213,1659,1160],{"class":866},[213,1661,427],{"class":226},[213,1663,1165],{"class":410},[213,1665,870],{"class":226},[213,1667,873],{"class":357},[213,1669,626],{"class":226},[213,1671,1672,1674,1676,1678,1680],{"class":215,"line":298},[213,1673,1176],{"class":357},[213,1675,571],{"class":230},[213,1677,581],{"class":226},[213,1679,566],{"class":370},[213,1681,1185],{"class":423},[213,1683,1684,1686,1688,1690,1692,1694,1696,1698],{"class":215,"line":319},[213,1685,1176],{"class":357},[213,1687,1192],{"class":230},[213,1689,581],{"class":226},[213,1691,1197],{"class":219},[213,1693,1200],{"class":230},[213,1695,522],{"class":226},[213,1697,1205],{"class":370},[213,1699,1185],{"class":423},[213,1701,1702],{"class":215,"line":340},[213,1703,344],{"emptyLinePlaceholder":343},[213,1705,1706,1708,1710,1712,1714,1716,1718,1720,1722,1725,1727,1729,1731,1734,1736,1738],{"class":215,"line":347},[213,1707,1221],{"class":230},[213,1709,522],{"class":226},[213,1711,1226],{"class":370},[213,1713,417],{"class":423},[213,1715,420],{"class":226},[213,1717,1373],{"class":423},[213,1719,427],{"class":226},[213,1721,227],{"class":226},[213,1723,1724],{"class":423}," amount",[213,1726,427],{"class":226},[213,1728,1192],{"class":230},[213,1730,522],{"class":226},[213,1732,1733],{"class":230},"amount",[213,1735,234],{"class":226},[213,1737,234],{"class":226},[213,1739,455],{"class":423},[213,1741,1742],{"class":215,"line":354},[213,1743,344],{"emptyLinePlaceholder":343},[213,1745,1746,1749,1751,1753,1755,1757,1760,1763,1765],{"class":215,"line":384},[213,1747,1748],{"class":219},"  if",[213,1750,863],{"class":423},[213,1752,1385],{"class":230},[213,1754,522],{"class":226},[213,1756,1733],{"class":230},[213,1758,1759],{"class":226}," \u003C=",[213,1761,1762],{"class":437}," 0",[213,1764,940],{"class":423},[213,1766,489],{"class":226},[213,1768,1769,1772,1774,1776],{"class":215,"line":389},[213,1770,1771],{"class":219},"    throw",[213,1773,1625],{"class":370},[213,1775,417],{"class":423},[213,1777,489],{"class":226},[213,1779,1780,1783,1785,1787],{"class":215,"line":395},[213,1781,1782],{"class":423},"      status",[213,1784,427],{"class":226},[213,1786,672],{"class":437},[213,1788,508],{"class":226},[213,1790,1791,1794,1796,1798,1801,1803],{"class":215,"line":458},[213,1792,1793],{"class":423},"      message",[213,1795,427],{"class":226},[213,1797,240],{"class":226},[213,1799,1800],{"class":243},"Invalid payment amount",[213,1802,505],{"class":226},[213,1804,508],{"class":226},[213,1806,1807,1810,1812,1814,1817,1819],{"class":215,"line":463},[213,1808,1809],{"class":423},"      why",[213,1811,427],{"class":226},[213,1813,240],{"class":226},[213,1815,1816],{"class":243},"The amount must be a positive number",[213,1818,505],{"class":226},[213,1820,508],{"class":226},[213,1822,1823,1826,1828,1830,1833,1835],{"class":215,"line":469},[213,1824,1825],{"class":423},"      fix",[213,1827,427],{"class":226},[213,1829,240],{"class":226},[213,1831,1832],{"class":243},"Pass a positive integer in cents (e.g. 4999 for $49.99)",[213,1834,505],{"class":226},[213,1836,508],{"class":226},[213,1838,1839,1842,1844,1846,1849,1851],{"class":215,"line":492},[213,1840,1841],{"class":423},"      link",[213,1843,427],{"class":226},[213,1845,240],{"class":226},[213,1847,1848],{"class":243},"https://docs.example.com/api/payments#amount",[213,1850,505],{"class":226},[213,1852,508],{"class":226},[213,1854,1855,1858],{"class":215,"line":511},[213,1856,1857],{"class":226},"    }",[213,1859,455],{"class":423},[213,1861,1862],{"class":215,"line":536},[213,1863,1864],{"class":226},"  }\n",[213,1866,1867],{"class":215,"line":545},[213,1868,344],{"emptyLinePlaceholder":343},[213,1870,1871,1873,1876,1878,1880,1883,1885,1887],{"class":215,"line":550},[213,1872,1176],{"class":357},[213,1874,1875],{"class":230}," result",[213,1877,581],{"class":226},[213,1879,1197],{"class":219},[213,1881,1882],{"class":370}," chargeCard",[213,1884,417],{"class":423},[213,1886,1385],{"class":230},[213,1888,455],{"class":423},[213,1890,1891],{"class":215,"line":590},[213,1892,344],{"emptyLinePlaceholder":343},[213,1894,1895,1897,1899,1902,1905,1907,1910,1912],{"class":215,"line":607},[213,1896,1748],{"class":219},[213,1898,863],{"class":423},[213,1900,1901],{"class":226},"!",[213,1903,1904],{"class":230},"result",[213,1906,522],{"class":226},[213,1908,1909],{"class":230},"success",[213,1911,940],{"class":423},[213,1913,489],{"class":226},[213,1915,1916,1919,1921,1924,1926,1929,1932,1934,1937,1940,1943,1945,1947,1950,1953],{"class":215,"line":612},[213,1917,1918],{"class":230},"    log",[213,1920,522],{"class":226},[213,1922,1923],{"class":370},"error",[213,1925,417],{"class":423},[213,1927,1928],{"class":226},"new",[213,1930,1931],{"class":370}," Error",[213,1933,417],{"class":423},[213,1935,1936],{"class":226},"`",[213,1938,1939],{"class":243},"Payment declined: ",[213,1941,1942],{"class":226},"${",[213,1944,1904],{"class":230},[213,1946,522],{"class":226},[213,1948,1949],{"class":230},"reason",[213,1951,1952],{"class":226},"}`",[213,1954,542],{"class":423},[213,1956,1957,1959,1961,1963],{"class":215,"line":618},[213,1958,1771],{"class":219},[213,1960,1625],{"class":370},[213,1962,417],{"class":423},[213,1964,489],{"class":226},[213,1966,1967,1969,1971,1974],{"class":215,"line":629},[213,1968,1782],{"class":423},[213,1970,427],{"class":226},[213,1972,1973],{"class":437}," 402",[213,1975,508],{"class":226},[213,1977,1978,1980,1982,1984,1987,1989],{"class":215,"line":650},[213,1979,1793],{"class":423},[213,1981,427],{"class":226},[213,1983,240],{"class":226},[213,1985,1986],{"class":243},"Payment declined",[213,1988,505],{"class":226},[213,1990,508],{"class":226},[213,1992,1993,1995,1997,2000,2003,2005,2007,2009,2011,2013],{"class":215,"line":661},[213,1994,1809],{"class":423},[213,1996,427],{"class":226},[213,1998,1999],{"class":226}," `",[213,2001,2002],{"class":243},"Card declined by issuer: ",[213,2004,1942],{"class":226},[213,2006,1904],{"class":230},[213,2008,522],{"class":226},[213,2010,1949],{"class":230},[213,2012,1952],{"class":226},[213,2014,508],{"class":226},[213,2016,2017,2019,2021,2023,2026,2028],{"class":215,"line":681},[213,2018,1825],{"class":423},[213,2020,427],{"class":226},[213,2022,240],{"class":226},[213,2024,2025],{"class":243},"Try a different payment method or contact your bank",[213,2027,505],{"class":226},[213,2029,508],{"class":226},[213,2031,2032,2034],{"class":215,"line":699},[213,2033,1857],{"class":226},[213,2035,455],{"class":423},[213,2037,2038],{"class":215,"line":721},[213,2039,1864],{"class":226},[213,2041,2042],{"class":215,"line":729},[213,2043,344],{"emptyLinePlaceholder":343},[213,2045,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066],{"class":215,"line":735},[213,2047,1451],{"class":219},[213,2049,1454],{"class":230},[213,2051,522],{"class":226},[213,2053,1205],{"class":370},[213,2055,417],{"class":423},[213,2057,420],{"class":226},[213,2059,1465],{"class":423},[213,2061,427],{"class":226},[213,2063,1470],{"class":952},[213,2065,234],{"class":226},[213,2067,455],{"class":423},[213,2069,2070,2072],{"class":215,"line":740},[213,2071,539],{"class":226},[213,2073,455],{"class":230},[187,2075,2076,2079,2080,2083],{},[199,2077,2078],{},"withEvlog()"," catches ",[199,2081,2082],{},"EvlogError"," and returns a structured JSON response (like Nitro does for Nuxt):",[204,2085,2089],{"className":2086,"code":2087,"filename":2088,"language":1205,"meta":209,"style":209},"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)",[199,2090,2091,2095,2117,2136,2151,2164,2184,2201,2205],{"__ignoreMap":209},[213,2092,2093],{"class":215,"line":216},[213,2094,489],{"class":226},[213,2096,2097,2100,2103,2106,2108,2111,2113,2115],{"class":215,"line":250},[213,2098,2099],{"class":226},"  \"",[213,2101,2102],{"class":357},"name",[213,2104,2105],{"class":226},"\"",[213,2107,427],{"class":226},[213,2109,2110],{"class":226}," \"",[213,2112,2082],{"class":243},[213,2114,2105],{"class":226},[213,2116,508],{"class":226},[213,2118,2119,2121,2124,2126,2128,2130,2132,2134],{"class":215,"line":271},[213,2120,2099],{"class":226},[213,2122,2123],{"class":357},"message",[213,2125,2105],{"class":226},[213,2127,427],{"class":226},[213,2129,2110],{"class":226},[213,2131,1986],{"class":243},[213,2133,2105],{"class":226},[213,2135,508],{"class":226},[213,2137,2138,2140,2143,2145,2147,2149],{"class":215,"line":298},[213,2139,2099],{"class":226},[213,2141,2142],{"class":357},"status",[213,2144,2105],{"class":226},[213,2146,427],{"class":226},[213,2148,1973],{"class":437},[213,2150,508],{"class":226},[213,2152,2153,2155,2158,2160,2162],{"class":215,"line":319},[213,2154,2099],{"class":226},[213,2156,2157],{"class":357},"data",[213,2159,2105],{"class":226},[213,2161,427],{"class":226},[213,2163,626],{"class":226},[213,2165,2166,2169,2171,2173,2175,2177,2180,2182],{"class":215,"line":340},[213,2167,2168],{"class":226},"    \"",[213,2170,1593],{"class":410},[213,2172,2105],{"class":226},[213,2174,427],{"class":226},[213,2176,2110],{"class":226},[213,2178,2179],{"class":243},"Card declined by issuer: insufficient_funds",[213,2181,2105],{"class":226},[213,2183,508],{"class":226},[213,2185,2186,2188,2190,2192,2194,2196,2198],{"class":215,"line":347},[213,2187,2168],{"class":226},[213,2189,1597],{"class":410},[213,2191,2105],{"class":226},[213,2193,427],{"class":226},[213,2195,2110],{"class":226},[213,2197,2025],{"class":243},[213,2199,2200],{"class":226},"\"\n",[213,2202,2203],{"class":215,"line":354},[213,2204,1864],{"class":226},[213,2206,2207],{"class":215,"line":384},[213,2208,2209],{"class":226},"}\n",[187,2211,2212],{},"In the terminal, the error renders with colored output:",[204,2214,2217],{"className":1500,"code":2215,"filename":2216,"language":1503,"meta":209,"style":209},"Error: Payment declined\nWhy: Card declined by issuer: insufficient_funds\nFix: Try a different payment method or contact your bank\n","Terminal output",[199,2218,2219,2230,2250],{"__ignoreMap":209},[213,2220,2221,2224,2227],{"class":215,"line":216},[213,2222,2223],{"class":410},"Error:",[213,2225,2226],{"class":243}," Payment",[213,2228,2229],{"class":243}," declined\n",[213,2231,2232,2235,2238,2241,2244,2247],{"class":215,"line":250},[213,2233,2234],{"class":410},"Why:",[213,2236,2237],{"class":243}," Card",[213,2239,2240],{"class":243}," declined",[213,2242,2243],{"class":243}," by",[213,2245,2246],{"class":243}," issuer:",[213,2248,2249],{"class":243}," insufficient_funds\n",[213,2251,2252,2255,2258,2261,2264,2266,2268,2271,2274,2277],{"class":215,"line":271},[213,2253,2254],{"class":410},"Fix:",[213,2256,2257],{"class":243}," Try",[213,2259,2260],{"class":243}," a",[213,2262,2263],{"class":243}," different",[213,2265,1373],{"class":243},[213,2267,1411],{"class":243},[213,2269,2270],{"class":243}," or",[213,2272,2273],{"class":243}," contact",[213,2275,2276],{"class":243}," your",[213,2278,2279],{"class":243}," bank\n",[2281,2282,2284],"h3",{"id":2283},"parsing-errors-on-the-client","Parsing Errors on the Client",[187,2286,1586,2287,2290,2291,2293,2294,2297],{},[199,2288,2289],{},"parseError"," to extract the structured fields from any error — fetch responses, ",[199,2292,2082],{},", or plain ",[199,2295,2296],{},"Error"," objects:",[204,2299,2304],{"className":2300,"code":2301,"filename":2302,"language":2303,"meta":209,"style":209},"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('/api/payment/process', {\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    // message: \"Payment declined\"\n    // why: \"Card declined by issuer: insufficient_funds\"\n    // fix: \"Try a different payment method or contact your bank\"\n  }\n}\n","app/components/PaymentForm.tsx","tsx",[199,2305,2306,2315,2334,2338,2362,2369,2396,2412,2464,2470,2523,2538,2578,2583,2588,2593,2597],{"__ignoreMap":209},[213,2307,2308,2310,2313],{"class":215,"line":216},[213,2309,505],{"class":226},[213,2311,2312],{"class":243},"use client",[213,2314,247],{"class":226},[213,2316,2317,2319,2321,2324,2326,2328,2330,2332],{"class":215,"line":250},[213,2318,220],{"class":219},[213,2320,227],{"class":226},[213,2322,2323],{"class":230}," parseError",[213,2325,234],{"class":226},[213,2327,237],{"class":219},[213,2329,240],{"class":226},[213,2331,244],{"class":243},[213,2333,247],{"class":226},[213,2335,2336],{"class":215,"line":271},[213,2337,344],{"emptyLinePlaceholder":343},[213,2339,2340,2342,2345,2348,2350,2353,2355,2358,2360],{"class":215,"line":298},[213,2341,1155],{"class":357},[213,2343,2344],{"class":357}," function",[213,2346,2347],{"class":370}," handleSubmit",[213,2349,417],{"class":226},[213,2351,2352],{"class":866},"formData",[213,2354,427],{"class":226},[213,2356,2357],{"class":410}," FormData",[213,2359,870],{"class":226},[213,2361,626],{"class":226},[213,2363,2364,2367],{"class":215,"line":319},[213,2365,2366],{"class":219},"  try",[213,2368,626],{"class":226},[213,2370,2371,2373,2376,2378,2380,2383,2385,2387,2390,2392,2394],{"class":215,"line":340},[213,2372,881],{"class":357},[213,2374,2375],{"class":230}," res",[213,2377,581],{"class":226},[213,2379,1197],{"class":219},[213,2381,2382],{"class":370}," fetch",[213,2384,417],{"class":423},[213,2386,505],{"class":226},[213,2388,2389],{"class":243},"/api/payment/process",[213,2391,505],{"class":226},[213,2393,281],{"class":226},[213,2395,626],{"class":226},[213,2397,2398,2401,2403,2405,2408,2410],{"class":215,"line":347},[213,2399,2400],{"class":423},"      method",[213,2402,427],{"class":226},[213,2404,240],{"class":226},[213,2406,2407],{"class":243},"POST",[213,2409,505],{"class":226},[213,2411,508],{"class":226},[213,2413,2414,2417,2419,2422,2424,2427,2429,2431,2433,2435,2438,2440,2442,2444,2447,2449,2451,2453,2455,2458,2460,2462],{"class":215,"line":354},[213,2415,2416],{"class":423},"      body",[213,2418,427],{"class":226},[213,2420,2421],{"class":230}," JSON",[213,2423,522],{"class":226},[213,2425,2426],{"class":370},"stringify",[213,2428,417],{"class":423},[213,2430,420],{"class":226},[213,2432,1724],{"class":423},[213,2434,427],{"class":226},[213,2436,2437],{"class":370}," Number",[213,2439,417],{"class":423},[213,2441,2352],{"class":230},[213,2443,522],{"class":226},[213,2445,2446],{"class":370},"get",[213,2448,417],{"class":423},[213,2450,505],{"class":226},[213,2452,1733],{"class":243},[213,2454,505],{"class":226},[213,2456,2457],{"class":423},")) ",[213,2459,539],{"class":226},[213,2461,870],{"class":423},[213,2463,508],{"class":226},[213,2465,2466,2468],{"class":215,"line":384},[213,2467,1857],{"class":226},[213,2469,455],{"class":423},[213,2471,2472,2474,2476,2478,2481,2483,2486,2488,2491,2493,2496,2498,2500,2502,2504,2506,2508,2510,2512,2514,2516,2518,2520],{"class":215,"line":389},[213,2473,927],{"class":219},[213,2475,863],{"class":423},[213,2477,1901],{"class":226},[213,2479,2480],{"class":230},"res",[213,2482,522],{"class":226},[213,2484,2485],{"class":230},"ok",[213,2487,940],{"class":423},[213,2489,2490],{"class":219},"throw",[213,2492,227],{"class":226},[213,2494,2495],{"class":423}," data",[213,2497,427],{"class":226},[213,2499,1197],{"class":219},[213,2501,2375],{"class":230},[213,2503,522],{"class":226},[213,2505,1205],{"class":370},[213,2507,374],{"class":423},[213,2509,281],{"class":226},[213,2511,667],{"class":423},[213,2513,427],{"class":226},[213,2515,2375],{"class":230},[213,2517,522],{"class":226},[213,2519,2142],{"class":230},[213,2521,2522],{"class":226}," }\n",[213,2524,2525,2527,2530,2532,2534,2536],{"class":215,"line":395},[213,2526,1272],{"class":226},[213,2528,2529],{"class":219}," catch",[213,2531,863],{"class":423},[213,2533,1923],{"class":230},[213,2535,940],{"class":423},[213,2537,489],{"class":226},[213,2539,2540,2542,2544,2547,2549,2551,2553,2556,2558,2561,2563,2566,2568,2570,2572,2574,2576],{"class":215,"line":458},[213,2541,881],{"class":357},[213,2543,227],{"class":226},[213,2545,2546],{"class":230}," message",[213,2548,281],{"class":226},[213,2550,667],{"class":230},[213,2552,281],{"class":226},[213,2554,2555],{"class":230}," why",[213,2557,281],{"class":226},[213,2559,2560],{"class":230}," fix",[213,2562,281],{"class":226},[213,2564,2565],{"class":230}," link",[213,2567,234],{"class":226},[213,2569,581],{"class":226},[213,2571,2323],{"class":370},[213,2573,417],{"class":423},[213,2575,1923],{"class":230},[213,2577,455],{"class":423},[213,2579,2580],{"class":215,"line":463},[213,2581,2582],{"class":350},"    // message: \"Payment declined\"\n",[213,2584,2585],{"class":215,"line":469},[213,2586,2587],{"class":350},"    // why: \"Card declined by issuer: insufficient_funds\"\n",[213,2589,2590],{"class":215,"line":492},[213,2591,2592],{"class":350},"    // fix: \"Try a different payment method or contact your bank\"\n",[213,2594,2595],{"class":215,"line":511},[213,2596,1864],{"class":226},[213,2598,2599],{"class":215,"line":536},[213,2600,2209],{"class":226},[187,2602,2603,2605,2606,2609,2610,2613],{},[199,2604,2289],{}," normalizes any error shape into a flat ",[199,2607,2608],{},"{ message, status, why?, fix?, link? }"," object, so your UI code never has to dig through nested ",[199,2611,2612],{},"data.data"," or check for different error formats.",[191,2615,2617],{"id":2616},"tail-sampling","Tail Sampling",[187,2619,2620],{},"Combine rule-based and custom tail sampling to always capture what matters, even when head sampling drops most logs:",[204,2622,2624],{"className":206,"code":2623,"filename":201,"language":208,"meta":209,"style":209},"export const { withEvlog, useLogger } = createEvlog({\n  service: 'my-app',\n  sampling: {\n    rates: { info: 10 }, // Only keep 10% of info logs\n    keep: [\n      { status: 400 },              // Always keep 4xx/5xx\n      { duration: 1000 },           // Always keep slow requests\n      { path: '/api/critical/**' }, // Always keep critical paths\n    ],\n  },\n  // 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",[199,2625,2626,2651,2665,2673,2692,2700,2715,2729,2747,2753,2757,2762,2778,2812,2836,2840],{"__ignoreMap":209},[213,2627,2628,2630,2632,2634,2636,2638,2641,2643,2645,2647,2649],{"class":215,"line":216},[213,2629,553],{"class":219},[213,2631,556],{"class":357},[213,2633,227],{"class":226},[213,2635,561],{"class":230},[213,2637,281],{"class":226},[213,2639,2640],{"class":230}," useLogger ",[213,2642,539],{"class":226},[213,2644,581],{"class":226},[213,2646,257],{"class":370},[213,2648,417],{"class":230},[213,2650,489],{"class":226},[213,2652,2653,2655,2657,2659,2661,2663],{"class":215,"line":250},[213,2654,593],{"class":423},[213,2656,427],{"class":226},[213,2658,240],{"class":226},[213,2660,600],{"class":243},[213,2662,505],{"class":226},[213,2664,508],{"class":226},[213,2666,2667,2669,2671],{"class":215,"line":271},[213,2668,621],{"class":423},[213,2670,427],{"class":226},[213,2672,626],{"class":226},[213,2674,2675,2677,2679,2681,2683,2685,2687,2689],{"class":215,"line":298},[213,2676,632],{"class":423},[213,2678,427],{"class":226},[213,2680,227],{"class":226},[213,2682,639],{"class":423},[213,2684,427],{"class":226},[213,2686,644],{"class":437},[213,2688,675],{"class":226},[213,2690,2691],{"class":350}," // Only keep 10% of info logs\n",[213,2693,2694,2696,2698],{"class":215,"line":319},[213,2695,653],{"class":423},[213,2697,427],{"class":226},[213,2699,658],{"class":230},[213,2701,2702,2704,2706,2708,2710,2712],{"class":215,"line":340},[213,2703,664],{"class":226},[213,2705,667],{"class":423},[213,2707,427],{"class":226},[213,2709,672],{"class":437},[213,2711,675],{"class":226},[213,2713,2714],{"class":350},"              // Always keep 4xx/5xx\n",[213,2716,2717,2719,2721,2723,2725,2727],{"class":215,"line":347},[213,2718,664],{"class":226},[213,2720,686],{"class":423},[213,2722,427],{"class":226},[213,2724,691],{"class":437},[213,2726,675],{"class":226},[213,2728,696],{"class":350},[213,2730,2731,2733,2735,2737,2739,2741,2743,2745],{"class":215,"line":354},[213,2732,664],{"class":226},[213,2734,704],{"class":423},[213,2736,427],{"class":226},[213,2738,240],{"class":226},[213,2740,711],{"class":243},[213,2742,505],{"class":226},[213,2744,675],{"class":226},[213,2746,718],{"class":350},[213,2748,2749,2751],{"class":215,"line":384},[213,2750,724],{"class":230},[213,2752,508],{"class":226},[213,2754,2755],{"class":215,"line":389},[213,2756,732],{"class":226},[213,2758,2759],{"class":215,"line":395},[213,2760,2761],{"class":350},"  // Custom: always keep premium user requests\n",[213,2763,2764,2766,2768,2770,2772,2774,2776],{"class":215,"line":458},[213,2765,858],{"class":370},[213,2767,427],{"class":226},[213,2769,863],{"class":226},[213,2771,867],{"class":866},[213,2773,870],{"class":226},[213,2775,873],{"class":357},[213,2777,626],{"class":226},[213,2779,2780,2782,2784,2786,2788,2790,2792,2794,2796,2798,2800,2802,2804,2806,2808,2810],{"class":215,"line":463},[213,2781,881],{"class":357},[213,2783,884],{"class":230},[213,2785,581],{"class":226},[213,2787,889],{"class":230},[213,2789,522],{"class":226},[213,2791,894],{"class":230},[213,2793,522],{"class":226},[213,2795,899],{"class":230},[213,2797,902],{"class":219},[213,2799,227],{"class":226},[213,2801,907],{"class":423},[213,2803,910],{"class":226},[213,2805,913],{"class":410},[213,2807,234],{"class":226},[213,2809,918],{"class":226},[213,2811,921],{"class":410},[213,2813,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832,2834],{"class":215,"line":469},[213,2815,927],{"class":219},[213,2817,863],{"class":423},[213,2819,899],{"class":230},[213,2821,934],{"class":226},[213,2823,937],{"class":230},[213,2825,940],{"class":423},[213,2827,867],{"class":230},[213,2829,522],{"class":226},[213,2831,947],{"class":230},[213,2833,581],{"class":226},[213,2835,953],{"class":952},[213,2837,2838],{"class":215,"line":492},[213,2839,732],{"class":226},[213,2841,2842,2844],{"class":215,"line":511},[213,2843,539],{"class":226},[213,2845,455],{"class":230},[187,2847,2848,2849,2852],{},"The ",[199,2850,2851],{},"keep"," rules use OR logic — any match forces the event through regardless of head sampling.",[191,2854,2856],{"id":2855},"middleware","Middleware",[187,2858,2859,2860,2863,2864,2867,2868,2870],{},"Set ",[199,2861,2862],{},"x-request-id"," and ",[199,2865,2866],{},"x-evlog-start"," headers so ",[199,2869,2078],{}," can correlate timing across the middleware → handler chain:",[204,2872,2875],{"className":206,"code":2873,"filename":2874,"language":208,"meta":209,"style":209},"import { evlogMiddleware } from 'evlog/next'\n\nexport const proxy = evlogMiddleware()\n\nexport const config = {\n  matcher: ['/api/:path*'],\n}\n","proxy.ts",[199,2876,2877,2896,2900,2915,2919,2932,2953],{"__ignoreMap":209},[213,2878,2879,2881,2883,2886,2888,2890,2892,2894],{"class":215,"line":216},[213,2880,220],{"class":219},[213,2882,227],{"class":226},[213,2884,2885],{"class":230}," evlogMiddleware",[213,2887,234],{"class":226},[213,2889,237],{"class":219},[213,2891,240],{"class":226},[213,2893,266],{"class":243},[213,2895,247],{"class":226},[213,2897,2898],{"class":215,"line":250},[213,2899,344],{"emptyLinePlaceholder":343},[213,2901,2902,2904,2906,2909,2911,2913],{"class":215,"line":271},[213,2903,553],{"class":219},[213,2905,556],{"class":357},[213,2907,2908],{"class":230}," proxy ",[213,2910,364],{"class":226},[213,2912,2885],{"class":370},[213,2914,1185],{"class":230},[213,2916,2917],{"class":215,"line":298},[213,2918,344],{"emptyLinePlaceholder":343},[213,2920,2921,2923,2925,2928,2930],{"class":215,"line":319},[213,2922,553],{"class":219},[213,2924,556],{"class":357},[213,2926,2927],{"class":230}," config ",[213,2929,364],{"class":226},[213,2931,626],{"class":226},[213,2933,2934,2937,2939,2941,2943,2946,2948,2951],{"class":215,"line":340},[213,2935,2936],{"class":423},"  matcher",[213,2938,427],{"class":226},[213,2940,367],{"class":230},[213,2942,505],{"class":226},[213,2944,2945],{"class":243},"/api/:path*",[213,2947,505],{"class":226},[213,2949,2950],{"class":230},"]",[213,2952,508],{"class":226},[213,2954,2955],{"class":215,"line":347},[213,2956,2209],{"class":226},[2958,2959,2961,2962,2965,2966,2968,2969,2971],"callout",{"color":2960,"icon":13},"info","Older versions of Next.js use ",[199,2963,2964],{},"middleware.ts"," instead of ",[199,2967,2874],{},". The evlog middleware works with both — import from ",[199,2970,266],{}," regardless.",[191,2973,2975],{"id":2974},"client-provider","Client Provider",[187,2977,2978,2979,2982],{},"Wrap your root layout with ",[199,2980,2981],{},"EvlogProvider"," to enable client-side logging and transport:",[204,2984,2987],{"className":2300,"code":2985,"filename":2986,"language":2303,"meta":209,"style":209},"import { EvlogProvider } from 'evlog/next/client'\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/EvlogProvider>\n      \u003C/body>\n    \u003C/html>\n  )\n}\n","app/layout.tsx",[199,2988,2989,3009,3013,3053,3060,3083,3092,3125,3135,3144,3153,3162,3167],{"__ignoreMap":209},[213,2990,2991,2993,2995,2998,3000,3002,3004,3007],{"class":215,"line":216},[213,2992,220],{"class":219},[213,2994,227],{"class":226},[213,2996,2997],{"class":230}," EvlogProvider",[213,2999,234],{"class":226},[213,3001,237],{"class":219},[213,3003,240],{"class":226},[213,3005,3006],{"class":243},"evlog/next/client",[213,3008,247],{"class":226},[213,3010,3011],{"class":215,"line":250},[213,3012,344],{"emptyLinePlaceholder":343},[213,3014,3015,3017,3020,3022,3025,3028,3031,3034,3036,3038,3040,3043,3045,3048,3051],{"class":215,"line":271},[213,3016,553],{"class":219},[213,3018,3019],{"class":219}," default",[213,3021,2344],{"class":357},[213,3023,3024],{"class":370}," Layout",[213,3026,3027],{"class":226},"({",[213,3029,3030],{"class":866}," children",[213,3032,3033],{"class":226}," }:",[213,3035,227],{"class":226},[213,3037,3030],{"class":423},[213,3039,427],{"class":226},[213,3041,3042],{"class":410}," React",[213,3044,522],{"class":226},[213,3046,3047],{"class":410},"ReactNode",[213,3049,3050],{"class":226}," })",[213,3052,626],{"class":226},[213,3054,3055,3057],{"class":215,"line":298},[213,3056,1451],{"class":219},[213,3058,3059],{"class":423}," (\n",[213,3061,3062,3065,3068,3071,3073,3075,3078,3080],{"class":215,"line":319},[213,3063,3064],{"class":226},"    \u003C",[213,3066,3067],{"class":423},"html",[213,3069,3070],{"class":357}," lang",[213,3072,364],{"class":226},[213,3074,2105],{"class":226},[213,3076,3077],{"class":243},"en",[213,3079,2105],{"class":226},[213,3081,3082],{"class":226},">\n",[213,3084,3085,3088,3090],{"class":215,"line":340},[213,3086,3087],{"class":226},"      \u003C",[213,3089,1385],{"class":423},[213,3091,3082],{"class":226},[213,3093,3094,3097,3099,3101,3103,3105,3107,3109,3112,3115,3118,3120,3122],{"class":215,"line":347},[213,3095,3096],{"class":226},"        \u003C",[213,3098,2981],{"class":410},[213,3100,771],{"class":357},[213,3102,364],{"class":226},[213,3104,2105],{"class":226},[213,3106,600],{"class":243},[213,3108,2105],{"class":226},[213,3110,3111],{"class":357}," transport",[213,3113,3114],{"class":226},"={{",[213,3116,3117],{"class":423}," enabled",[213,3119,427],{"class":226},[213,3121,1470],{"class":952},[213,3123,3124],{"class":226}," }}>\n",[213,3126,3127,3130,3133],{"class":215,"line":354},[213,3128,3129],{"class":226},"          {",[213,3131,3132],{"class":230},"children",[213,3134,2209],{"class":226},[213,3136,3137,3140,3142],{"class":215,"line":384},[213,3138,3139],{"class":226},"        \u003C/",[213,3141,2981],{"class":410},[213,3143,3082],{"class":226},[213,3145,3146,3149,3151],{"class":215,"line":389},[213,3147,3148],{"class":226},"      \u003C/",[213,3150,1385],{"class":423},[213,3152,3082],{"class":226},[213,3154,3155,3158,3160],{"class":215,"line":395},[213,3156,3157],{"class":226},"    \u003C/",[213,3159,3067],{"class":423},[213,3161,3082],{"class":226},[213,3163,3164],{"class":215,"line":458},[213,3165,3166],{"class":423},"  )\n",[213,3168,3169],{"class":215,"line":463},[213,3170,2209],{"class":226},[191,3172,3174],{"id":3173},"client-logging","Client Logging",[187,3176,1586,3177,3180],{},[199,3178,3179],{},"log"," in any client component. Identity is preserved across all logs and transported to the server:",[204,3182,3185],{"className":2300,"code":3183,"filename":3184,"language":2303,"meta":209,"style":209},"'use client'\nimport { log, setIdentity, clearIdentity } from 'evlog/next/client'\n\nexport function Dashboard({ user }: { user: { id: string } }) {\n  // 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/button>\n  )\n}\n","app/components/Dashboard.tsx",[199,3186,3187,3195,3223,3227,3263,3268,3281,3306,3320,3336,3340,3346,3404,3409,3417,3421],{"__ignoreMap":209},[213,3188,3189,3191,3193],{"class":215,"line":216},[213,3190,505],{"class":226},[213,3192,2312],{"class":243},[213,3194,247],{"class":226},[213,3196,3197,3199,3201,3203,3205,3208,3210,3213,3215,3217,3219,3221],{"class":215,"line":250},[213,3198,220],{"class":219},[213,3200,227],{"class":226},[213,3202,571],{"class":230},[213,3204,281],{"class":226},[213,3206,3207],{"class":230}," setIdentity",[213,3209,281],{"class":226},[213,3211,3212],{"class":230}," clearIdentity",[213,3214,234],{"class":226},[213,3216,237],{"class":219},[213,3218,240],{"class":226},[213,3220,3006],{"class":243},[213,3222,247],{"class":226},[213,3224,3225],{"class":215,"line":271},[213,3226,344],{"emptyLinePlaceholder":343},[213,3228,3229,3231,3233,3236,3238,3240,3242,3244,3246,3248,3250,3252,3254,3257,3259,3261],{"class":215,"line":298},[213,3230,553],{"class":219},[213,3232,2344],{"class":357},[213,3234,3235],{"class":370}," Dashboard",[213,3237,3027],{"class":226},[213,3239,884],{"class":866},[213,3241,3033],{"class":226},[213,3243,227],{"class":226},[213,3245,884],{"class":423},[213,3247,427],{"class":226},[213,3249,227],{"class":226},[213,3251,1242],{"class":423},[213,3253,427],{"class":226},[213,3255,3256],{"class":410}," string",[213,3258,234],{"class":226},[213,3260,3050],{"class":226},[213,3262,626],{"class":226},[213,3264,3265],{"class":215,"line":319},[213,3266,3267],{"class":350},"  // Set identity once — all subsequent logs include it\n",[213,3269,3270,3273,3275,3277,3279],{"class":215,"line":340},[213,3271,3272],{"class":370},"  useEffect",[213,3274,417],{"class":423},[213,3276,374],{"class":226},[213,3278,873],{"class":357},[213,3280,626],{"class":226},[213,3282,3283,3286,3288,3290,3293,3295,3297,3299,3302,3304],{"class":215,"line":347},[213,3284,3285],{"class":370},"    setIdentity",[213,3287,417],{"class":423},[213,3289,420],{"class":226},[213,3291,3292],{"class":423}," userId",[213,3294,427],{"class":226},[213,3296,884],{"class":230},[213,3298,522],{"class":226},[213,3300,3301],{"class":230},"id",[213,3303,234],{"class":226},[213,3305,455],{"class":423},[213,3307,3308,3311,3314,3316,3318],{"class":215,"line":354},[213,3309,3310],{"class":219},"    return",[213,3312,3313],{"class":226}," ()",[213,3315,873],{"class":357},[213,3317,3212],{"class":370},[213,3319,1185],{"class":423},[213,3321,3322,3325,3327,3329,3331,3333],{"class":215,"line":384},[213,3323,3324],{"class":226},"  },",[213,3326,367],{"class":423},[213,3328,899],{"class":230},[213,3330,522],{"class":226},[213,3332,3301],{"class":230},[213,3334,3335],{"class":423},"])\n",[213,3337,3338],{"class":215,"line":389},[213,3339,344],{"emptyLinePlaceholder":343},[213,3341,3342,3344],{"class":215,"line":395},[213,3343,1451],{"class":219},[213,3345,3059],{"class":423},[213,3347,3348,3350,3353,3356,3359,3361,3363,3365,3367,3369,3371,3374,3376,3378,3381,3383,3385,3388,3390,3392,3395,3397,3399,3401],{"class":215,"line":458},[213,3349,3064],{"class":226},[213,3351,3352],{"class":423},"button",[213,3354,3355],{"class":357}," onClick",[213,3357,3358],{"class":226},"={()",[213,3360,873],{"class":357},[213,3362,571],{"class":230},[213,3364,522],{"class":226},[213,3366,2960],{"class":370},[213,3368,417],{"class":230},[213,3370,420],{"class":226},[213,3372,3373],{"class":423}," action",[213,3375,427],{"class":226},[213,3377,240],{"class":226},[213,3379,3380],{"class":243},"export_clicked",[213,3382,505],{"class":226},[213,3384,281],{"class":226},[213,3386,3387],{"class":423}," format",[213,3389,427],{"class":226},[213,3391,240],{"class":226},[213,3393,3394],{"class":243},"csv",[213,3396,505],{"class":226},[213,3398,234],{"class":226},[213,3400,870],{"class":230},[213,3402,3403],{"class":226},"}>\n",[213,3405,3406],{"class":215,"line":463},[213,3407,3408],{"class":230},"      Export\n",[213,3410,3411,3413,3415],{"class":215,"line":469},[213,3412,3157],{"class":226},[213,3414,3352],{"class":423},[213,3416,3082],{"class":226},[213,3418,3419],{"class":215,"line":492},[213,3420,3166],{"class":423},[213,3422,3423],{"class":215,"line":511},[213,3424,2209],{"class":226},[191,3426,3428],{"id":3427},"browser-drain","Browser Drain",[187,3430,3431,3432,3434],{},"For advanced use cases, send structured ",[199,3433,411],{}," events directly from the browser to a custom endpoint:",[204,3436,3438],{"className":206,"code":3437,"language":208,"meta":209,"style":209},"import { createBrowserLogDrain } from 'evlog/browser'\n\nconst drain = createBrowserLogDrain({\n  drain: { endpoint: '/api/evlog/browser-ingest' },\n  pipeline: { batch: { size: 10, intervalMs: 5000 } },\n})\n\ndrain(drainEvent)\nawait drain.flush()\n",[199,3439,3440,3460,3464,3478,3500,3533,3539,3543,3551],{"__ignoreMap":209},[213,3441,3442,3444,3446,3449,3451,3453,3455,3458],{"class":215,"line":216},[213,3443,220],{"class":219},[213,3445,227],{"class":226},[213,3447,3448],{"class":230}," createBrowserLogDrain",[213,3450,234],{"class":226},[213,3452,237],{"class":219},[213,3454,240],{"class":226},[213,3456,3457],{"class":243},"evlog/browser",[213,3459,247],{"class":226},[213,3461,3462],{"class":215,"line":250},[213,3463,344],{"emptyLinePlaceholder":343},[213,3465,3466,3468,3470,3472,3474,3476],{"class":215,"line":271},[213,3467,358],{"class":357},[213,3469,474],{"class":230},[213,3471,364],{"class":226},[213,3473,3448],{"class":370},[213,3475,417],{"class":230},[213,3477,489],{"class":226},[213,3479,3480,3482,3484,3486,3489,3491,3493,3496,3498],{"class":215,"line":298},[213,3481,1089],{"class":423},[213,3483,427],{"class":226},[213,3485,227],{"class":226},[213,3487,3488],{"class":423}," endpoint",[213,3490,427],{"class":226},[213,3492,240],{"class":226},[213,3494,3495],{"class":243},"/api/evlog/browser-ingest",[213,3497,505],{"class":226},[213,3499,647],{"class":226},[213,3501,3502,3505,3507,3509,3511,3513,3515,3517,3519,3521,3523,3525,3527,3529,3531],{"class":215,"line":319},[213,3503,3504],{"class":423},"  pipeline",[213,3506,427],{"class":226},[213,3508,227],{"class":226},[213,3510,424],{"class":423},[213,3512,427],{"class":226},[213,3514,227],{"class":226},[213,3516,432],{"class":423},[213,3518,427],{"class":226},[213,3520,644],{"class":437},[213,3522,281],{"class":226},[213,3524,443],{"class":423},[213,3526,427],{"class":226},[213,3528,448],{"class":437},[213,3530,234],{"class":226},[213,3532,647],{"class":226},[213,3534,3535,3537],{"class":215,"line":340},[213,3536,539],{"class":226},[213,3538,455],{"class":230},[213,3540,3541],{"class":215,"line":347},[213,3542,344],{"emptyLinePlaceholder":343},[213,3544,3545,3548],{"class":215,"line":354},[213,3546,3547],{"class":370},"drain",[213,3549,3550],{"class":230},"(drainEvent)\n",[213,3552,3553,3556,3559,3561,3564],{"class":215,"line":384},[213,3554,3555],{"class":219},"await",[213,3557,3558],{"class":230}," drain",[213,3560,522],{"class":226},[213,3562,3563],{"class":370},"flush",[213,3565,1185],{"class":230},[187,3567,3568],{},"The server endpoint receives batched events:",[204,3570,3573],{"className":206,"code":3571,"filename":3572,"language":208,"meta":209,"style":209},"export async function POST(request: Request) {\n  const events = await request.json()\n  // Forward to your drain pipeline, Axiom, etc.\n  return new Response(null, { status: 204 })\n}\n","app/api/evlog/browser-ingest/route.ts",[199,3574,3575,3599,3618,3623,3650],{"__ignoreMap":209},[213,3576,3577,3579,3582,3584,3587,3589,3591,3593,3595,3597],{"class":215,"line":216},[213,3578,553],{"class":219},[213,3580,3581],{"class":357}," async",[213,3583,2344],{"class":357},[213,3585,3586],{"class":370}," POST",[213,3588,417],{"class":226},[213,3590,1160],{"class":866},[213,3592,427],{"class":226},[213,3594,1165],{"class":410},[213,3596,870],{"class":226},[213,3598,626],{"class":226},[213,3600,3601,3603,3606,3608,3610,3612,3614,3616],{"class":215,"line":250},[213,3602,1176],{"class":357},[213,3604,3605],{"class":230}," events",[213,3607,581],{"class":226},[213,3609,1197],{"class":219},[213,3611,1200],{"class":230},[213,3613,522],{"class":226},[213,3615,1205],{"class":370},[213,3617,1185],{"class":423},[213,3619,3620],{"class":215,"line":271},[213,3621,3622],{"class":350},"  // Forward to your drain pipeline, Axiom, etc.\n",[213,3624,3625,3627,3630,3632,3634,3637,3639,3641,3643,3646,3648],{"class":215,"line":298},[213,3626,1451],{"class":219},[213,3628,3629],{"class":226}," new",[213,3631,1454],{"class":370},[213,3633,417],{"class":423},[213,3635,3636],{"class":226},"null,",[213,3638,227],{"class":226},[213,3640,667],{"class":423},[213,3642,427],{"class":226},[213,3644,3645],{"class":437}," 204",[213,3647,234],{"class":226},[213,3649,455],{"class":423},[213,3651,3652],{"class":215,"line":319},[213,3653,2209],{"class":226},[191,3655,3657],{"id":3656},"run-locally","Run Locally",[204,3659,3661],{"className":1500,"code":3660,"language":1503,"meta":209,"style":209},"git clone https://github.com/HugoRCD/evlog.git\ncd evlog/examples/nextjs\nbun install\nbun run dev\n",[199,3662,3663,3674,3682,3690],{"__ignoreMap":209},[213,3664,3665,3668,3671],{"class":215,"line":216},[213,3666,3667],{"class":410},"git",[213,3669,3670],{"class":243}," clone",[213,3672,3673],{"class":243}," https://github.com/HugoRCD/evlog.git\n",[213,3675,3676,3679],{"class":215,"line":250},[213,3677,3678],{"class":370},"cd",[213,3680,3681],{"class":243}," evlog/examples/nextjs\n",[213,3683,3684,3687],{"class":215,"line":271},[213,3685,3686],{"class":410},"bun",[213,3688,3689],{"class":243}," install\n",[213,3691,3692,3694,3697],{"class":215,"line":298},[213,3693,3686],{"class":410},[213,3695,3696],{"class":243}," run",[213,3698,3699],{"class":243}," dev\n",[187,3701,3702,3703,3709],{},"Open ",[3704,3705,3706],"a",{"href":3706,"rel":3707},"http://localhost:3000",[3708],"nofollow"," to explore the example.",[3711,3712,3713],"card-group",{},[3714,3715,3719],"card",{"icon":3716,"title":3717,"to":3718},"i-simple-icons-github","Source Code","https://github.com/HugoRCD/evlog/tree/main/examples/nextjs","Browse the complete Next.js example source on GitHub.",[3721,3722,3723],"style",{},"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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);}",{"title":209,"searchDepth":250,"depth":250,"links":3725},[3726,3727,3728,3731,3732,3733,3734,3735,3736],{"id":193,"depth":250,"text":194},{"id":1101,"depth":250,"text":36},{"id":1582,"depth":250,"text":1583,"children":3729},[3730],{"id":2283,"depth":271,"text":2284},{"id":2616,"depth":250,"text":2617},{"id":2855,"depth":250,"text":2856},{"id":2974,"depth":250,"text":2975},{"id":3173,"depth":250,"text":3174},{"id":3427,"depth":250,"text":3428},{"id":3656,"depth":250,"text":3657},"Practical patterns for evlog with Next.js — enrichers, drain pipeline, tail sampling, route-based services, error handling, and client-side logging.","md",[3740],{"label":3717,"icon":3716,"to":3718,"color":3741,"variant":3742},"neutral","subtle",{},{"title":142,"icon":145},{"title":142,"description":3737},"HMDtbVZ5zMPMIJENY5PgBdlbKJuxFKEJKEafia4bzgk",[3748,3750],{"title":132,"path":133,"stem":134,"description":3749,"icon":135,"children":-1},"Configure how long logs are kept in NuxtHub and how they are automatically cleaned up with scheduled tasks, cron jobs, and retention policies.",{"title":147,"path":148,"stem":149,"description":3751,"icon":150,"children":-1},"Using evlog with TanStack Start — automatic wide events, structured errors, and logging in API routes and server functions.",1772899532273]