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