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