[{"data":1,"prerenderedAt":2832},["ShallowReactive",2],{"navigation_docs":3,"-frameworks-elysia":219,"-frameworks-elysia-surround":2827},[4,30,105,139,188,205],{"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},"Frameworks","/frameworks","2.frameworks",[35,40,45,50,55,60,65,70,75,80,85,90,95,100],{"title":36,"path":37,"stem":38,"icon":39},"Overview","/frameworks/overview","2.frameworks/00.overview","i-lucide-layout-grid",{"title":41,"path":42,"stem":43,"icon":44},"Nuxt","/frameworks/nuxt","2.frameworks/01.nuxt","i-simple-icons-nuxtdotjs",{"title":46,"path":47,"stem":48,"icon":49},"Next.js","/frameworks/nextjs","2.frameworks/02.nextjs","i-simple-icons-nextdotjs",{"title":51,"path":52,"stem":53,"icon":54},"SvelteKit","/frameworks/sveltekit","2.frameworks/03.sveltekit","i-simple-icons-svelte",{"title":56,"path":57,"stem":58,"icon":59},"Nitro","/frameworks/nitro","2.frameworks/04.nitro","i-custom-nitro",{"title":61,"path":62,"stem":63,"icon":64},"TanStack Start","/frameworks/tanstack-start","2.frameworks/05.tanstack-start","i-custom-tanstack",{"title":66,"path":67,"stem":68,"icon":69},"NestJS","/frameworks/nestjs","2.frameworks/06.nestjs","i-simple-icons-nestjs",{"title":71,"path":72,"stem":73,"icon":74},"Express","/frameworks/express","2.frameworks/07.express","i-simple-icons-express",{"title":76,"path":77,"stem":78,"icon":79},"Hono","/frameworks/hono","2.frameworks/08.hono","i-simple-icons-hono",{"title":81,"path":82,"stem":83,"icon":84},"Fastify","/frameworks/fastify","2.frameworks/09.fastify","i-simple-icons-fastify",{"title":86,"path":87,"stem":88,"icon":89},"Elysia","/frameworks/elysia","2.frameworks/10.elysia","i-custom-elysia",{"title":91,"path":92,"stem":93,"icon":94},"Cloudflare Workers","/frameworks/cloudflare-workers","2.frameworks/11.cloudflare-workers","i-simple-icons-cloudflare",{"title":96,"path":97,"stem":98,"icon":99},"Standalone","/frameworks/standalone","2.frameworks/12.standalone","i-simple-icons-typescript",{"title":101,"path":102,"stem":103,"icon":104},"Astro","/frameworks/astro","2.frameworks/13.astro","i-simple-icons-astro",{"title":106,"path":107,"stem":108,"children":109,"page":29},"Core Concepts","/core-concepts","3.core-concepts",[110,115,120,125,129,134],{"title":111,"path":112,"stem":113,"icon":114},"Wide Events","/core-concepts/wide-events","3.core-concepts/1.wide-events","i-lucide-layers",{"title":116,"path":117,"stem":118,"icon":119},"Structured Errors","/core-concepts/structured-errors","3.core-concepts/2.structured-errors","i-lucide-shield-alert",{"title":121,"path":122,"stem":123,"icon":124},"Best Practices","/core-concepts/best-practices","3.core-concepts/3.best-practices","i-lucide-shield-check",{"title":126,"path":127,"stem":128,"icon":99},"Typed Fields","/core-concepts/typed-fields","3.core-concepts/4.typed-fields",{"title":130,"path":131,"stem":132,"icon":133},"Sampling","/core-concepts/sampling","3.core-concepts/5.sampling","i-lucide-filter",{"title":135,"path":136,"stem":137,"icon":138},"Client Logging","/core-concepts/client-logging","3.core-concepts/6.client-logging","i-lucide-monitor",{"title":140,"path":141,"stem":142,"children":143,"page":29},"Adapters","/adapters","4.adapters",[144,148,153,158,163,168,173,178,183],{"title":36,"path":145,"stem":146,"icon":147},"/adapters/overview","4.adapters/1.overview","i-custom-plug",{"title":149,"path":150,"stem":151,"icon":152},"Axiom","/adapters/axiom","4.adapters/2.axiom","i-custom-axiom",{"title":154,"path":155,"stem":156,"icon":157},"OTLP","/adapters/otlp","4.adapters/3.otlp","i-simple-icons-opentelemetry",{"title":159,"path":160,"stem":161,"icon":162},"PostHog","/adapters/posthog","4.adapters/4.posthog","i-simple-icons-posthog",{"title":164,"path":165,"stem":166,"icon":167},"Sentry","/adapters/sentry","4.adapters/5.sentry","i-simple-icons-sentry",{"title":169,"path":170,"stem":171,"icon":172},"Better Stack","/adapters/better-stack","4.adapters/6.better-stack","i-simple-icons-betterstack",{"title":174,"path":175,"stem":176,"icon":177},"Custom Adapters","/adapters/custom","4.adapters/7.custom","i-lucide-code",{"title":179,"path":180,"stem":181,"icon":182},"Pipeline","/adapters/pipeline","4.adapters/8.pipeline","i-lucide-workflow",{"title":184,"path":185,"stem":186,"icon":187},"Browser","/adapters/browser","4.adapters/9.browser","i-lucide-globe",{"title":189,"path":190,"stem":191,"children":192,"page":29},"Enrichers","/enrichers","5.enrichers",[193,196,201],{"title":36,"path":194,"stem":195,"icon":28},"/enrichers/overview","5.enrichers/1.overview",{"title":197,"path":198,"stem":199,"icon":200},"Built-in","/enrichers/built-in","5.enrichers/2.built-in","i-lucide-puzzle",{"title":202,"path":203,"stem":204,"icon":177},"Custom","/enrichers/custom","5.enrichers/3.custom",{"title":206,"path":207,"stem":208,"children":209,"page":29},"NuxtHub","/nuxthub","6.nuxthub",[210,214],{"title":36,"path":211,"stem":212,"icon":213},"/nuxthub/overview","6.nuxthub/1.overview","i-lucide-database",{"title":215,"path":216,"stem":217,"icon":218},"Retention","/nuxthub/retention","6.nuxthub/2.retention","i-lucide-clock",{"id":220,"title":86,"body":221,"description":2817,"extension":2818,"links":2819,"meta":2823,"navigation":2824,"path":87,"seo":2825,"stem":88,"__hash__":2826},"docs/2.frameworks/10.elysia.md",{"type":222,"value":223,"toc":2798},"minimark",[224,241,245,250,278,282,571,579,582,585,870,873,937,940,946,1129,1222,1238,1242,1263,1635,1638,1704,1708,1711,1879,1883,1890,2081,2095,2099,2105,2209,2213,2224,2367,2371,2377,2381,2535,2539,2546,2723,2731,2735,2776,2785,2794],[225,226,227,228,232,233,236,237,240],"p",{},"The ",[229,230,231],"code",{},"evlog/elysia"," plugin auto-creates a request-scoped logger accessible via ",[229,234,235],{},"log"," in route context and ",[229,238,239],{},"useLogger()",", emitting a wide event when the response completes.",[242,243,20],"h2",{"id":244},"quick-start",[246,247,249],"h3",{"id":248},"_1-install","1. Install",[251,252,257],"pre",{"className":253,"code":254,"language":255,"meta":256,"style":256},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun add evlog elysia\n","bash","",[229,258,259],{"__ignoreMap":256},[260,261,264,268,272,275],"span",{"class":262,"line":263},"line",1,[260,265,267],{"class":266},"sBMFI","bun",[260,269,271],{"class":270},"sfazB"," add",[260,273,274],{"class":270}," evlog",[260,276,277],{"class":270}," elysia\n",[246,279,281],{"id":280},"_2-initialize-and-register-the-plugin","2. Initialize and register the plugin",[251,283,288],{"className":284,"code":285,"filename":286,"language":287,"meta":256,"style":256},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Elysia } from 'elysia'\nimport { initLogger } from 'evlog'\nimport { evlog } from 'evlog/elysia'\n\ninitLogger({\n  env: { service: 'my-api' },\n})\n\nconst app = new Elysia()\n  .use(evlog())\n  .get('/health', ({ log }) => {\n    log.set({ route: 'health' })\n    return { ok: true }\n  })\n  .listen(3000)\n","src/index.ts","typescript",[229,289,290,319,340,359,366,379,407,416,421,442,458,494,527,547,555],{"__ignoreMap":256},[260,291,292,296,300,304,307,310,313,316],{"class":262,"line":263},[260,293,295],{"class":294},"s7zQu","import",[260,297,299],{"class":298},"sMK4o"," {",[260,301,303],{"class":302},"sTEyZ"," Elysia",[260,305,306],{"class":298}," }",[260,308,309],{"class":294}," from",[260,311,312],{"class":298}," '",[260,314,315],{"class":270},"elysia",[260,317,318],{"class":298},"'\n",[260,320,322,324,326,329,331,333,335,338],{"class":262,"line":321},2,[260,323,295],{"class":294},[260,325,299],{"class":298},[260,327,328],{"class":302}," initLogger",[260,330,306],{"class":298},[260,332,309],{"class":294},[260,334,312],{"class":298},[260,336,337],{"class":270},"evlog",[260,339,318],{"class":298},[260,341,343,345,347,349,351,353,355,357],{"class":262,"line":342},3,[260,344,295],{"class":294},[260,346,299],{"class":298},[260,348,274],{"class":302},[260,350,306],{"class":298},[260,352,309],{"class":294},[260,354,312],{"class":298},[260,356,231],{"class":270},[260,358,318],{"class":298},[260,360,362],{"class":262,"line":361},4,[260,363,365],{"emptyLinePlaceholder":364},true,"\n",[260,367,369,373,376],{"class":262,"line":368},5,[260,370,372],{"class":371},"s2Zo4","initLogger",[260,374,375],{"class":302},"(",[260,377,378],{"class":298},"{\n",[260,380,382,386,389,391,394,396,398,401,404],{"class":262,"line":381},6,[260,383,385],{"class":384},"swJcz","  env",[260,387,388],{"class":298},":",[260,390,299],{"class":298},[260,392,393],{"class":384}," service",[260,395,388],{"class":298},[260,397,312],{"class":298},[260,399,400],{"class":270},"my-api",[260,402,403],{"class":298},"'",[260,405,406],{"class":298}," },\n",[260,408,410,413],{"class":262,"line":409},7,[260,411,412],{"class":298},"}",[260,414,415],{"class":302},")\n",[260,417,419],{"class":262,"line":418},8,[260,420,365],{"emptyLinePlaceholder":364},[260,422,424,428,431,434,437,439],{"class":262,"line":423},9,[260,425,427],{"class":426},"spNyl","const",[260,429,430],{"class":302}," app ",[260,432,433],{"class":298},"=",[260,435,436],{"class":298}," new",[260,438,303],{"class":371},[260,440,441],{"class":302},"()\n",[260,443,445,448,451,453,455],{"class":262,"line":444},10,[260,446,447],{"class":298},"  .",[260,449,450],{"class":371},"use",[260,452,375],{"class":302},[260,454,337],{"class":371},[260,456,457],{"class":302},"())\n",[260,459,461,463,466,468,470,473,475,478,481,485,488,491],{"class":262,"line":460},11,[260,462,447],{"class":298},[260,464,465],{"class":371},"get",[260,467,375],{"class":302},[260,469,403],{"class":298},[260,471,472],{"class":270},"/health",[260,474,403],{"class":298},[260,476,477],{"class":298},",",[260,479,480],{"class":298}," ({",[260,482,484],{"class":483},"sHdIc"," log",[260,486,487],{"class":298}," })",[260,489,490],{"class":426}," =>",[260,492,493],{"class":298}," {\n",[260,495,497,500,503,506,508,511,514,516,518,521,523,525],{"class":262,"line":496},12,[260,498,499],{"class":302},"    log",[260,501,502],{"class":298},".",[260,504,505],{"class":371},"set",[260,507,375],{"class":384},[260,509,510],{"class":298},"{",[260,512,513],{"class":384}," route",[260,515,388],{"class":298},[260,517,312],{"class":298},[260,519,520],{"class":270},"health",[260,522,403],{"class":298},[260,524,306],{"class":298},[260,526,415],{"class":384},[260,528,530,533,535,538,540,544],{"class":262,"line":529},13,[260,531,532],{"class":294},"    return",[260,534,299],{"class":298},[260,536,537],{"class":384}," ok",[260,539,388],{"class":298},[260,541,543],{"class":542},"sfNiH"," true",[260,545,546],{"class":298}," }\n",[260,548,550,553],{"class":262,"line":549},14,[260,551,552],{"class":298},"  }",[260,554,415],{"class":302},[260,556,558,560,563,565,569],{"class":262,"line":557},15,[260,559,447],{"class":298},[260,561,562],{"class":371},"listen",[260,564,375],{"class":302},[260,566,568],{"class":567},"sbssI","3000",[260,570,415],{"class":302},[225,572,227,573,575,576,502],{},[229,574,235],{}," property is automatically available in all route handlers via Elysia's ",[229,577,578],{},"derive",[242,580,111],{"id":581},"wide-events",[225,583,584],{},"Build up context progressively through your handler. One request = one wide event:",[251,586,588],{"className":284,"code":587,"filename":286,"language":287,"meta":256,"style":256},"app.get('/users/:id', async ({ log, params }) => {\n  const userId = params.id\n\n  log.set({ user: { id: userId } })\n\n  const user = await db.findUser(userId)\n  log.set({ user: { name: user.name, plan: user.plan } })\n\n  const orders = await db.findOrders(userId)\n  log.set({ orders: { count: orders.length, totalRevenue: sum(orders) } })\n\n  return { user, orders }\n})\n",[229,589,590,628,646,650,683,687,713,763,767,791,845,849,864],{"__ignoreMap":256},[260,591,592,595,597,599,601,603,606,608,610,613,615,617,619,622,624,626],{"class":262,"line":263},[260,593,594],{"class":302},"app",[260,596,502],{"class":298},[260,598,465],{"class":371},[260,600,375],{"class":302},[260,602,403],{"class":298},[260,604,605],{"class":270},"/users/:id",[260,607,403],{"class":298},[260,609,477],{"class":298},[260,611,612],{"class":426}," async",[260,614,480],{"class":298},[260,616,484],{"class":483},[260,618,477],{"class":298},[260,620,621],{"class":483}," params",[260,623,487],{"class":298},[260,625,490],{"class":426},[260,627,493],{"class":298},[260,629,630,633,636,639,641,643],{"class":262,"line":321},[260,631,632],{"class":426},"  const",[260,634,635],{"class":302}," userId",[260,637,638],{"class":298}," =",[260,640,621],{"class":302},[260,642,502],{"class":298},[260,644,645],{"class":302},"id\n",[260,647,648],{"class":262,"line":342},[260,649,365],{"emptyLinePlaceholder":364},[260,651,652,655,657,659,661,663,666,668,670,673,675,677,679,681],{"class":262,"line":361},[260,653,654],{"class":302},"  log",[260,656,502],{"class":298},[260,658,505],{"class":371},[260,660,375],{"class":384},[260,662,510],{"class":298},[260,664,665],{"class":384}," user",[260,667,388],{"class":298},[260,669,299],{"class":298},[260,671,672],{"class":384}," id",[260,674,388],{"class":298},[260,676,635],{"class":302},[260,678,306],{"class":298},[260,680,306],{"class":298},[260,682,415],{"class":384},[260,684,685],{"class":262,"line":368},[260,686,365],{"emptyLinePlaceholder":364},[260,688,689,691,693,695,698,701,703,706,708,711],{"class":262,"line":381},[260,690,632],{"class":426},[260,692,665],{"class":302},[260,694,638],{"class":298},[260,696,697],{"class":294}," await",[260,699,700],{"class":302}," db",[260,702,502],{"class":298},[260,704,705],{"class":371},"findUser",[260,707,375],{"class":384},[260,709,710],{"class":302},"userId",[260,712,415],{"class":384},[260,714,715,717,719,721,723,725,727,729,731,734,736,738,740,743,745,748,750,752,754,757,759,761],{"class":262,"line":409},[260,716,654],{"class":302},[260,718,502],{"class":298},[260,720,505],{"class":371},[260,722,375],{"class":384},[260,724,510],{"class":298},[260,726,665],{"class":384},[260,728,388],{"class":298},[260,730,299],{"class":298},[260,732,733],{"class":384}," name",[260,735,388],{"class":298},[260,737,665],{"class":302},[260,739,502],{"class":298},[260,741,742],{"class":302},"name",[260,744,477],{"class":298},[260,746,747],{"class":384}," plan",[260,749,388],{"class":298},[260,751,665],{"class":302},[260,753,502],{"class":298},[260,755,756],{"class":302},"plan",[260,758,306],{"class":298},[260,760,306],{"class":298},[260,762,415],{"class":384},[260,764,765],{"class":262,"line":418},[260,766,365],{"emptyLinePlaceholder":364},[260,768,769,771,774,776,778,780,782,785,787,789],{"class":262,"line":423},[260,770,632],{"class":426},[260,772,773],{"class":302}," orders",[260,775,638],{"class":298},[260,777,697],{"class":294},[260,779,700],{"class":302},[260,781,502],{"class":298},[260,783,784],{"class":371},"findOrders",[260,786,375],{"class":384},[260,788,710],{"class":302},[260,790,415],{"class":384},[260,792,793,795,797,799,801,803,805,807,809,812,814,816,818,821,823,826,828,831,833,836,839,841,843],{"class":262,"line":444},[260,794,654],{"class":302},[260,796,502],{"class":298},[260,798,505],{"class":371},[260,800,375],{"class":384},[260,802,510],{"class":298},[260,804,773],{"class":384},[260,806,388],{"class":298},[260,808,299],{"class":298},[260,810,811],{"class":384}," count",[260,813,388],{"class":298},[260,815,773],{"class":302},[260,817,502],{"class":298},[260,819,820],{"class":302},"length",[260,822,477],{"class":298},[260,824,825],{"class":384}," totalRevenue",[260,827,388],{"class":298},[260,829,830],{"class":371}," sum",[260,832,375],{"class":384},[260,834,835],{"class":302},"orders",[260,837,838],{"class":384},") ",[260,840,412],{"class":298},[260,842,306],{"class":298},[260,844,415],{"class":384},[260,846,847],{"class":262,"line":460},[260,848,365],{"emptyLinePlaceholder":364},[260,850,851,854,856,858,860,862],{"class":262,"line":496},[260,852,853],{"class":294},"  return",[260,855,299],{"class":298},[260,857,665],{"class":302},[260,859,477],{"class":298},[260,861,773],{"class":302},[260,863,546],{"class":298},[260,865,866,868],{"class":262,"line":529},[260,867,412],{"class":298},[260,869,415],{"class":302},[225,871,872],{},"All fields are merged into a single wide event emitted when the request completes:",[251,874,877],{"className":253,"code":875,"filename":876,"language":255,"meta":256,"style":256},"14:58:15 INFO [my-api] GET /users/usr_123 200 in 12ms\n  ├─ orders: count=2 totalRevenue=6298\n  ├─ user: id=usr_123 name=Alice plan=pro\n  └─ requestId: 4a8ff3a8-...\n","Terminal output",[229,878,879,890,910,926],{"__ignoreMap":256},[260,880,881,884,887],{"class":262,"line":263},[260,882,883],{"class":266},"14:58:15",[260,885,886],{"class":270}," INFO",[260,888,889],{"class":302}," [my-api] GET /users/usr_123 200 in 12ms\n",[260,891,892,895,898,901,904,907],{"class":262,"line":321},[260,893,894],{"class":266},"  ├─",[260,896,897],{"class":270}," orders:",[260,899,900],{"class":270}," count=",[260,902,903],{"class":567},"2",[260,905,906],{"class":270}," totalRevenue=",[260,908,909],{"class":567},"6298\n",[260,911,912,914,917,920,923],{"class":262,"line":342},[260,913,894],{"class":266},[260,915,916],{"class":270}," user:",[260,918,919],{"class":270}," id=usr_123",[260,921,922],{"class":270}," name=Alice",[260,924,925],{"class":270}," plan=pro\n",[260,927,928,931,934],{"class":262,"line":361},[260,929,930],{"class":266},"  └─",[260,932,933],{"class":270}," requestId:",[260,935,936],{"class":270}," 4a8ff3a8-...\n",[242,938,239],{"id":939},"uselogger",[225,941,942,943,945],{},"Use ",[229,944,239],{}," to access the request-scoped logger from anywhere in the call stack — no need to pass the context through your service layer:",[251,947,950],{"className":284,"code":948,"filename":949,"language":287,"meta":256,"style":256},"import { useLogger } from 'evlog/elysia'\n\nexport async function findUser(id: string) {\n  const log = useLogger()\n  log.set({ user: { id } })\n\n  const user = await db.findUser(id)\n  log.set({ user: { name: user.name, plan: user.plan } })\n\n  return user\n}\n","src/services/user.ts",[229,951,952,971,975,1003,1015,1041,1045,1067,1113,1117,1124],{"__ignoreMap":256},[260,953,954,956,958,961,963,965,967,969],{"class":262,"line":263},[260,955,295],{"class":294},[260,957,299],{"class":298},[260,959,960],{"class":302}," useLogger",[260,962,306],{"class":298},[260,964,309],{"class":294},[260,966,312],{"class":298},[260,968,231],{"class":270},[260,970,318],{"class":298},[260,972,973],{"class":262,"line":321},[260,974,365],{"emptyLinePlaceholder":364},[260,976,977,980,982,985,988,990,993,995,998,1001],{"class":262,"line":342},[260,978,979],{"class":294},"export",[260,981,612],{"class":426},[260,983,984],{"class":426}," function",[260,986,987],{"class":371}," findUser",[260,989,375],{"class":298},[260,991,992],{"class":483},"id",[260,994,388],{"class":298},[260,996,997],{"class":266}," string",[260,999,1000],{"class":298},")",[260,1002,493],{"class":298},[260,1004,1005,1007,1009,1011,1013],{"class":262,"line":361},[260,1006,632],{"class":426},[260,1008,484],{"class":302},[260,1010,638],{"class":298},[260,1012,960],{"class":371},[260,1014,441],{"class":384},[260,1016,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035,1037,1039],{"class":262,"line":368},[260,1018,654],{"class":302},[260,1020,502],{"class":298},[260,1022,505],{"class":371},[260,1024,375],{"class":384},[260,1026,510],{"class":298},[260,1028,665],{"class":384},[260,1030,388],{"class":298},[260,1032,299],{"class":298},[260,1034,672],{"class":302},[260,1036,306],{"class":298},[260,1038,306],{"class":298},[260,1040,415],{"class":384},[260,1042,1043],{"class":262,"line":381},[260,1044,365],{"emptyLinePlaceholder":364},[260,1046,1047,1049,1051,1053,1055,1057,1059,1061,1063,1065],{"class":262,"line":409},[260,1048,632],{"class":426},[260,1050,665],{"class":302},[260,1052,638],{"class":298},[260,1054,697],{"class":294},[260,1056,700],{"class":302},[260,1058,502],{"class":298},[260,1060,705],{"class":371},[260,1062,375],{"class":384},[260,1064,992],{"class":302},[260,1066,415],{"class":384},[260,1068,1069,1071,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095,1097,1099,1101,1103,1105,1107,1109,1111],{"class":262,"line":418},[260,1070,654],{"class":302},[260,1072,502],{"class":298},[260,1074,505],{"class":371},[260,1076,375],{"class":384},[260,1078,510],{"class":298},[260,1080,665],{"class":384},[260,1082,388],{"class":298},[260,1084,299],{"class":298},[260,1086,733],{"class":384},[260,1088,388],{"class":298},[260,1090,665],{"class":302},[260,1092,502],{"class":298},[260,1094,742],{"class":302},[260,1096,477],{"class":298},[260,1098,747],{"class":384},[260,1100,388],{"class":298},[260,1102,665],{"class":302},[260,1104,502],{"class":298},[260,1106,756],{"class":302},[260,1108,306],{"class":298},[260,1110,306],{"class":298},[260,1112,415],{"class":384},[260,1114,1115],{"class":262,"line":423},[260,1116,365],{"emptyLinePlaceholder":364},[260,1118,1119,1121],{"class":262,"line":444},[260,1120,853],{"class":294},[260,1122,1123],{"class":302}," user\n",[260,1125,1126],{"class":262,"line":460},[260,1127,1128],{"class":298},"}\n",[251,1130,1132],{"className":284,"code":1131,"filename":286,"language":287,"meta":256,"style":256},"import { findUser } from './services/user'\n\napp.get('/users/:id', async ({ params }) => {\n  const user = await findUser(params.id)\n  return user\n})\n",[229,1133,1134,1153,1157,1187,1210,1216],{"__ignoreMap":256},[260,1135,1136,1138,1140,1142,1144,1146,1148,1151],{"class":262,"line":263},[260,1137,295],{"class":294},[260,1139,299],{"class":298},[260,1141,987],{"class":302},[260,1143,306],{"class":298},[260,1145,309],{"class":294},[260,1147,312],{"class":298},[260,1149,1150],{"class":270},"./services/user",[260,1152,318],{"class":298},[260,1154,1155],{"class":262,"line":321},[260,1156,365],{"emptyLinePlaceholder":364},[260,1158,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185],{"class":262,"line":342},[260,1160,594],{"class":302},[260,1162,502],{"class":298},[260,1164,465],{"class":371},[260,1166,375],{"class":302},[260,1168,403],{"class":298},[260,1170,605],{"class":270},[260,1172,403],{"class":298},[260,1174,477],{"class":298},[260,1176,612],{"class":426},[260,1178,480],{"class":298},[260,1180,621],{"class":483},[260,1182,487],{"class":298},[260,1184,490],{"class":426},[260,1186,493],{"class":298},[260,1188,1189,1191,1193,1195,1197,1199,1201,1204,1206,1208],{"class":262,"line":361},[260,1190,632],{"class":426},[260,1192,665],{"class":302},[260,1194,638],{"class":298},[260,1196,697],{"class":294},[260,1198,987],{"class":371},[260,1200,375],{"class":384},[260,1202,1203],{"class":302},"params",[260,1205,502],{"class":298},[260,1207,992],{"class":302},[260,1209,415],{"class":384},[260,1211,1212,1214],{"class":262,"line":368},[260,1213,853],{"class":294},[260,1215,1123],{"class":302},[260,1217,1218,1220],{"class":262,"line":381},[260,1219,412],{"class":298},[260,1221,415],{"class":302},[225,1223,1224,1225,1227,1228,1230,1231,1233,1234,1237],{},"Both ",[229,1226,235],{}," in context and ",[229,1229,239],{}," return the same logger instance. ",[229,1232,239],{}," uses ",[229,1235,1236],{},"AsyncLocalStorage"," to propagate the logger across async boundaries.",[242,1239,1241],{"id":1240},"error-handling","Error Handling",[225,1243,942,1244,1247,1248,1251,1252,1255,1256,1259,1260,388],{},[229,1245,1246],{},"createError"," for structured errors with ",[229,1249,1250],{},"why",", ",[229,1253,1254],{},"fix",", and ",[229,1257,1258],{},"link"," fields. Elysia captures thrown errors via ",[229,1261,1262],{},"onError",[251,1264,1266],{"className":284,"code":1265,"filename":286,"language":287,"meta":256,"style":256},"import { createError, parseError } from 'evlog'\n\napp\n  .use(evlog())\n  .get('/checkout', ({ log }) => {\n    log.set({ cart: { items: 3, total: 9999 } })\n\n    throw createError({\n      message: 'Payment failed',\n      status: 402,\n      why: 'Card declined by issuer',\n      fix: 'Try a different payment method',\n      link: 'https://docs.example.com/payments/declined',\n    })\n  })\n  .onError(({ error, set }) => {\n    const parsed = parseError(error)\n    set.status = parsed.status\n    return {\n      message: parsed.message,\n      why: parsed.why,\n      fix: parsed.fix,\n      link: parsed.link,\n    }\n  })\n",[229,1267,1268,1292,1296,1301,1313,1340,1383,1387,1398,1415,1427,1443,1459,1475,1482,1488,1514,1534,1554,1561,1577,1592,1607,1622,1628],{"__ignoreMap":256},[260,1269,1270,1272,1274,1277,1279,1282,1284,1286,1288,1290],{"class":262,"line":263},[260,1271,295],{"class":294},[260,1273,299],{"class":298},[260,1275,1276],{"class":302}," createError",[260,1278,477],{"class":298},[260,1280,1281],{"class":302}," parseError",[260,1283,306],{"class":298},[260,1285,309],{"class":294},[260,1287,312],{"class":298},[260,1289,337],{"class":270},[260,1291,318],{"class":298},[260,1293,1294],{"class":262,"line":321},[260,1295,365],{"emptyLinePlaceholder":364},[260,1297,1298],{"class":262,"line":342},[260,1299,1300],{"class":302},"app\n",[260,1302,1303,1305,1307,1309,1311],{"class":262,"line":361},[260,1304,447],{"class":298},[260,1306,450],{"class":371},[260,1308,375],{"class":302},[260,1310,337],{"class":371},[260,1312,457],{"class":302},[260,1314,1315,1317,1319,1321,1323,1326,1328,1330,1332,1334,1336,1338],{"class":262,"line":368},[260,1316,447],{"class":298},[260,1318,465],{"class":371},[260,1320,375],{"class":302},[260,1322,403],{"class":298},[260,1324,1325],{"class":270},"/checkout",[260,1327,403],{"class":298},[260,1329,477],{"class":298},[260,1331,480],{"class":298},[260,1333,484],{"class":483},[260,1335,487],{"class":298},[260,1337,490],{"class":426},[260,1339,493],{"class":298},[260,1341,1342,1344,1346,1348,1350,1352,1355,1357,1359,1362,1364,1367,1369,1372,1374,1377,1379,1381],{"class":262,"line":381},[260,1343,499],{"class":302},[260,1345,502],{"class":298},[260,1347,505],{"class":371},[260,1349,375],{"class":384},[260,1351,510],{"class":298},[260,1353,1354],{"class":384}," cart",[260,1356,388],{"class":298},[260,1358,299],{"class":298},[260,1360,1361],{"class":384}," items",[260,1363,388],{"class":298},[260,1365,1366],{"class":567}," 3",[260,1368,477],{"class":298},[260,1370,1371],{"class":384}," total",[260,1373,388],{"class":298},[260,1375,1376],{"class":567}," 9999",[260,1378,306],{"class":298},[260,1380,306],{"class":298},[260,1382,415],{"class":384},[260,1384,1385],{"class":262,"line":409},[260,1386,365],{"emptyLinePlaceholder":364},[260,1388,1389,1392,1394,1396],{"class":262,"line":418},[260,1390,1391],{"class":294},"    throw",[260,1393,1276],{"class":371},[260,1395,375],{"class":384},[260,1397,378],{"class":298},[260,1399,1400,1403,1405,1407,1410,1412],{"class":262,"line":423},[260,1401,1402],{"class":384},"      message",[260,1404,388],{"class":298},[260,1406,312],{"class":298},[260,1408,1409],{"class":270},"Payment failed",[260,1411,403],{"class":298},[260,1413,1414],{"class":298},",\n",[260,1416,1417,1420,1422,1425],{"class":262,"line":444},[260,1418,1419],{"class":384},"      status",[260,1421,388],{"class":298},[260,1423,1424],{"class":567}," 402",[260,1426,1414],{"class":298},[260,1428,1429,1432,1434,1436,1439,1441],{"class":262,"line":460},[260,1430,1431],{"class":384},"      why",[260,1433,388],{"class":298},[260,1435,312],{"class":298},[260,1437,1438],{"class":270},"Card declined by issuer",[260,1440,403],{"class":298},[260,1442,1414],{"class":298},[260,1444,1445,1448,1450,1452,1455,1457],{"class":262,"line":496},[260,1446,1447],{"class":384},"      fix",[260,1449,388],{"class":298},[260,1451,312],{"class":298},[260,1453,1454],{"class":270},"Try a different payment method",[260,1456,403],{"class":298},[260,1458,1414],{"class":298},[260,1460,1461,1464,1466,1468,1471,1473],{"class":262,"line":529},[260,1462,1463],{"class":384},"      link",[260,1465,388],{"class":298},[260,1467,312],{"class":298},[260,1469,1470],{"class":270},"https://docs.example.com/payments/declined",[260,1472,403],{"class":298},[260,1474,1414],{"class":298},[260,1476,1477,1480],{"class":262,"line":549},[260,1478,1479],{"class":298},"    }",[260,1481,415],{"class":384},[260,1483,1484,1486],{"class":262,"line":557},[260,1485,552],{"class":298},[260,1487,415],{"class":302},[260,1489,1491,1493,1495,1497,1500,1503,1505,1508,1510,1512],{"class":262,"line":1490},16,[260,1492,447],{"class":298},[260,1494,1262],{"class":371},[260,1496,375],{"class":302},[260,1498,1499],{"class":298},"({",[260,1501,1502],{"class":483}," error",[260,1504,477],{"class":298},[260,1506,1507],{"class":483}," set",[260,1509,487],{"class":298},[260,1511,490],{"class":426},[260,1513,493],{"class":298},[260,1515,1517,1520,1523,1525,1527,1529,1532],{"class":262,"line":1516},17,[260,1518,1519],{"class":426},"    const",[260,1521,1522],{"class":302}," parsed",[260,1524,638],{"class":298},[260,1526,1281],{"class":371},[260,1528,375],{"class":384},[260,1530,1531],{"class":302},"error",[260,1533,415],{"class":384},[260,1535,1537,1540,1542,1545,1547,1549,1551],{"class":262,"line":1536},18,[260,1538,1539],{"class":302},"    set",[260,1541,502],{"class":298},[260,1543,1544],{"class":302},"status",[260,1546,638],{"class":298},[260,1548,1522],{"class":302},[260,1550,502],{"class":298},[260,1552,1553],{"class":302},"status\n",[260,1555,1557,1559],{"class":262,"line":1556},19,[260,1558,532],{"class":294},[260,1560,493],{"class":298},[260,1562,1564,1566,1568,1570,1572,1575],{"class":262,"line":1563},20,[260,1565,1402],{"class":384},[260,1567,388],{"class":298},[260,1569,1522],{"class":302},[260,1571,502],{"class":298},[260,1573,1574],{"class":302},"message",[260,1576,1414],{"class":298},[260,1578,1580,1582,1584,1586,1588,1590],{"class":262,"line":1579},21,[260,1581,1431],{"class":384},[260,1583,388],{"class":298},[260,1585,1522],{"class":302},[260,1587,502],{"class":298},[260,1589,1250],{"class":302},[260,1591,1414],{"class":298},[260,1593,1595,1597,1599,1601,1603,1605],{"class":262,"line":1594},22,[260,1596,1447],{"class":384},[260,1598,388],{"class":298},[260,1600,1522],{"class":302},[260,1602,502],{"class":298},[260,1604,1254],{"class":302},[260,1606,1414],{"class":298},[260,1608,1610,1612,1614,1616,1618,1620],{"class":262,"line":1609},23,[260,1611,1463],{"class":384},[260,1613,388],{"class":298},[260,1615,1522],{"class":302},[260,1617,502],{"class":298},[260,1619,1258],{"class":302},[260,1621,1414],{"class":298},[260,1623,1625],{"class":262,"line":1624},24,[260,1626,1627],{"class":298},"    }\n",[260,1629,1631,1633],{"class":262,"line":1630},25,[260,1632,552],{"class":298},[260,1634,415],{"class":302},[225,1636,1637],{},"The error is captured and logged with both the custom context and structured error fields:",[251,1639,1641],{"className":253,"code":1640,"filename":876,"language":255,"meta":256,"style":256},"14:58:20 ERROR [my-api] GET /checkout 402 in 3ms\n  ├─ error: name=EvlogError message=Payment failed status=402\n  ├─ cart: items=3 total=9999\n  └─ requestId: 880a50ac-...\n",[229,1642,1643,1654,1676,1695],{"__ignoreMap":256},[260,1644,1645,1648,1651],{"class":262,"line":263},[260,1646,1647],{"class":266},"14:58:20",[260,1649,1650],{"class":270}," ERROR",[260,1652,1653],{"class":302}," [my-api] GET /checkout 402 in 3ms\n",[260,1655,1656,1658,1661,1664,1667,1670,1673],{"class":262,"line":321},[260,1657,894],{"class":266},[260,1659,1660],{"class":270}," error:",[260,1662,1663],{"class":270}," name=EvlogError",[260,1665,1666],{"class":270}," message=Payment",[260,1668,1669],{"class":270}," failed",[260,1671,1672],{"class":270}," status=",[260,1674,1675],{"class":567},"402\n",[260,1677,1678,1680,1683,1686,1689,1692],{"class":262,"line":342},[260,1679,894],{"class":266},[260,1681,1682],{"class":270}," cart:",[260,1684,1685],{"class":270}," items=",[260,1687,1688],{"class":567},"3",[260,1690,1691],{"class":270}," total=",[260,1693,1694],{"class":567},"9999\n",[260,1696,1697,1699,1701],{"class":262,"line":361},[260,1698,930],{"class":266},[260,1700,933],{"class":270},[260,1702,1703],{"class":270}," 880a50ac-...\n",[242,1705,1707],{"id":1706},"drain-enrichers","Drain & Enrichers",[225,1709,1710],{},"Configure drain adapters and enrichers directly in the plugin options:",[251,1712,1714],{"className":284,"code":1713,"filename":286,"language":287,"meta":256,"style":256},"import { createAxiomDrain } from 'evlog/axiom'\nimport { createUserAgentEnricher } from 'evlog/enrichers'\n\nconst userAgent = createUserAgentEnricher()\n\napp.use(evlog({\n  drain: createAxiomDrain(),\n  enrich: (ctx) => {\n    userAgent(ctx)\n    ctx.event.region = process.env.FLY_REGION\n  },\n}))\n",[229,1715,1716,1736,1756,1760,1773,1777,1793,1807,1826,1837,1867,1872],{"__ignoreMap":256},[260,1717,1718,1720,1722,1725,1727,1729,1731,1734],{"class":262,"line":263},[260,1719,295],{"class":294},[260,1721,299],{"class":298},[260,1723,1724],{"class":302}," createAxiomDrain",[260,1726,306],{"class":298},[260,1728,309],{"class":294},[260,1730,312],{"class":298},[260,1732,1733],{"class":270},"evlog/axiom",[260,1735,318],{"class":298},[260,1737,1738,1740,1742,1745,1747,1749,1751,1754],{"class":262,"line":321},[260,1739,295],{"class":294},[260,1741,299],{"class":298},[260,1743,1744],{"class":302}," createUserAgentEnricher",[260,1746,306],{"class":298},[260,1748,309],{"class":294},[260,1750,312],{"class":298},[260,1752,1753],{"class":270},"evlog/enrichers",[260,1755,318],{"class":298},[260,1757,1758],{"class":262,"line":342},[260,1759,365],{"emptyLinePlaceholder":364},[260,1761,1762,1764,1767,1769,1771],{"class":262,"line":361},[260,1763,427],{"class":426},[260,1765,1766],{"class":302}," userAgent ",[260,1768,433],{"class":298},[260,1770,1744],{"class":371},[260,1772,441],{"class":302},[260,1774,1775],{"class":262,"line":368},[260,1776,365],{"emptyLinePlaceholder":364},[260,1778,1779,1781,1783,1785,1787,1789,1791],{"class":262,"line":381},[260,1780,594],{"class":302},[260,1782,502],{"class":298},[260,1784,450],{"class":371},[260,1786,375],{"class":302},[260,1788,337],{"class":371},[260,1790,375],{"class":302},[260,1792,378],{"class":298},[260,1794,1795,1798,1800,1802,1805],{"class":262,"line":409},[260,1796,1797],{"class":384},"  drain",[260,1799,388],{"class":298},[260,1801,1724],{"class":371},[260,1803,1804],{"class":302},"()",[260,1806,1414],{"class":298},[260,1808,1809,1812,1814,1817,1820,1822,1824],{"class":262,"line":418},[260,1810,1811],{"class":371},"  enrich",[260,1813,388],{"class":298},[260,1815,1816],{"class":298}," (",[260,1818,1819],{"class":483},"ctx",[260,1821,1000],{"class":298},[260,1823,490],{"class":426},[260,1825,493],{"class":298},[260,1827,1828,1831,1833,1835],{"class":262,"line":423},[260,1829,1830],{"class":371},"    userAgent",[260,1832,375],{"class":384},[260,1834,1819],{"class":302},[260,1836,415],{"class":384},[260,1838,1839,1842,1844,1847,1849,1852,1854,1857,1859,1862,1864],{"class":262,"line":444},[260,1840,1841],{"class":302},"    ctx",[260,1843,502],{"class":298},[260,1845,1846],{"class":302},"event",[260,1848,502],{"class":298},[260,1850,1851],{"class":302},"region",[260,1853,638],{"class":298},[260,1855,1856],{"class":302}," process",[260,1858,502],{"class":298},[260,1860,1861],{"class":302},"env",[260,1863,502],{"class":298},[260,1865,1866],{"class":302},"FLY_REGION\n",[260,1868,1869],{"class":262,"line":460},[260,1870,1871],{"class":298},"  },\n",[260,1873,1874,1876],{"class":262,"line":496},[260,1875,412],{"class":298},[260,1877,1878],{"class":302},"))\n",[246,1880,1882],{"id":1881},"pipeline-batching-retry","Pipeline (Batching & Retry)",[225,1884,1885,1886,1889],{},"For production, wrap your adapter with ",[229,1887,1888],{},"createDrainPipeline"," to batch events and retry on failure:",[251,1891,1893],{"className":284,"code":1892,"filename":286,"language":287,"meta":256,"style":256},"import type { DrainContext } from 'evlog'\nimport { createAxiomDrain } from 'evlog/axiom'\nimport { createDrainPipeline } from 'evlog/pipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({\n  batch: { size: 50, intervalMs: 5000 },\n  retry: { maxAttempts: 3 },\n})\nconst drain = pipeline(createAxiomDrain())\n\napp.use(evlog({ drain }))\n",[229,1894,1895,1917,1935,1955,1959,1983,2012,2030,2036,2055,2059],{"__ignoreMap":256},[260,1896,1897,1899,1902,1904,1907,1909,1911,1913,1915],{"class":262,"line":263},[260,1898,295],{"class":294},[260,1900,1901],{"class":294}," type",[260,1903,299],{"class":298},[260,1905,1906],{"class":302}," DrainContext",[260,1908,306],{"class":298},[260,1910,309],{"class":294},[260,1912,312],{"class":298},[260,1914,337],{"class":270},[260,1916,318],{"class":298},[260,1918,1919,1921,1923,1925,1927,1929,1931,1933],{"class":262,"line":321},[260,1920,295],{"class":294},[260,1922,299],{"class":298},[260,1924,1724],{"class":302},[260,1926,306],{"class":298},[260,1928,309],{"class":294},[260,1930,312],{"class":298},[260,1932,1733],{"class":270},[260,1934,318],{"class":298},[260,1936,1937,1939,1941,1944,1946,1948,1950,1953],{"class":262,"line":342},[260,1938,295],{"class":294},[260,1940,299],{"class":298},[260,1942,1943],{"class":302}," createDrainPipeline",[260,1945,306],{"class":298},[260,1947,309],{"class":294},[260,1949,312],{"class":298},[260,1951,1952],{"class":270},"evlog/pipeline",[260,1954,318],{"class":298},[260,1956,1957],{"class":262,"line":361},[260,1958,365],{"emptyLinePlaceholder":364},[260,1960,1961,1963,1966,1968,1970,1973,1976,1979,1981],{"class":262,"line":368},[260,1962,427],{"class":426},[260,1964,1965],{"class":302}," pipeline ",[260,1967,433],{"class":298},[260,1969,1943],{"class":371},[260,1971,1972],{"class":298},"\u003C",[260,1974,1975],{"class":266},"DrainContext",[260,1977,1978],{"class":298},">",[260,1980,375],{"class":302},[260,1982,378],{"class":298},[260,1984,1985,1988,1990,1992,1995,1997,2000,2002,2005,2007,2010],{"class":262,"line":381},[260,1986,1987],{"class":384},"  batch",[260,1989,388],{"class":298},[260,1991,299],{"class":298},[260,1993,1994],{"class":384}," size",[260,1996,388],{"class":298},[260,1998,1999],{"class":567}," 50",[260,2001,477],{"class":298},[260,2003,2004],{"class":384}," intervalMs",[260,2006,388],{"class":298},[260,2008,2009],{"class":567}," 5000",[260,2011,406],{"class":298},[260,2013,2014,2017,2019,2021,2024,2026,2028],{"class":262,"line":409},[260,2015,2016],{"class":384},"  retry",[260,2018,388],{"class":298},[260,2020,299],{"class":298},[260,2022,2023],{"class":384}," maxAttempts",[260,2025,388],{"class":298},[260,2027,1366],{"class":567},[260,2029,406],{"class":298},[260,2031,2032,2034],{"class":262,"line":418},[260,2033,412],{"class":298},[260,2035,415],{"class":302},[260,2037,2038,2040,2043,2045,2048,2050,2053],{"class":262,"line":423},[260,2039,427],{"class":426},[260,2041,2042],{"class":302}," drain ",[260,2044,433],{"class":298},[260,2046,2047],{"class":371}," pipeline",[260,2049,375],{"class":302},[260,2051,2052],{"class":371},"createAxiomDrain",[260,2054,457],{"class":302},[260,2056,2057],{"class":262,"line":444},[260,2058,365],{"emptyLinePlaceholder":364},[260,2060,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079],{"class":262,"line":460},[260,2062,594],{"class":302},[260,2064,502],{"class":298},[260,2066,450],{"class":371},[260,2068,375],{"class":302},[260,2070,337],{"class":371},[260,2072,375],{"class":302},[260,2074,510],{"class":298},[260,2076,2042],{"class":302},[260,2078,412],{"class":298},[260,2080,1878],{"class":302},[2082,2083,2085,2086,2089,2090,2094],"callout",{"color":2084,"icon":13},"info","Call ",[229,2087,2088],{},"drain.flush()"," on server shutdown to ensure all buffered events are sent. See the ",[2091,2092,2093],"a",{"href":180},"Pipeline docs"," for all options.",[242,2096,2098],{"id":2097},"tail-sampling","Tail Sampling",[225,2100,942,2101,2104],{},[229,2102,2103],{},"keep"," to force-retain specific events regardless of head sampling:",[251,2106,2108],{"className":284,"code":2107,"filename":286,"language":287,"meta":256,"style":256},"app.use(evlog({\n  drain: createAxiomDrain(),\n  keep: (ctx) => {\n    if (ctx.duration && ctx.duration > 2000) ctx.shouldKeep = true\n  },\n}))\n",[229,2109,2110,2126,2138,2155,2199,2203],{"__ignoreMap":256},[260,2111,2112,2114,2116,2118,2120,2122,2124],{"class":262,"line":263},[260,2113,594],{"class":302},[260,2115,502],{"class":298},[260,2117,450],{"class":371},[260,2119,375],{"class":302},[260,2121,337],{"class":371},[260,2123,375],{"class":302},[260,2125,378],{"class":298},[260,2127,2128,2130,2132,2134,2136],{"class":262,"line":321},[260,2129,1797],{"class":384},[260,2131,388],{"class":298},[260,2133,1724],{"class":371},[260,2135,1804],{"class":302},[260,2137,1414],{"class":298},[260,2139,2140,2143,2145,2147,2149,2151,2153],{"class":262,"line":342},[260,2141,2142],{"class":371},"  keep",[260,2144,388],{"class":298},[260,2146,1816],{"class":298},[260,2148,1819],{"class":483},[260,2150,1000],{"class":298},[260,2152,490],{"class":426},[260,2154,493],{"class":298},[260,2156,2157,2160,2162,2164,2166,2169,2172,2175,2177,2179,2182,2185,2187,2189,2191,2194,2196],{"class":262,"line":361},[260,2158,2159],{"class":294},"    if",[260,2161,1816],{"class":384},[260,2163,1819],{"class":302},[260,2165,502],{"class":298},[260,2167,2168],{"class":302},"duration",[260,2170,2171],{"class":298}," &&",[260,2173,2174],{"class":302}," ctx",[260,2176,502],{"class":298},[260,2178,2168],{"class":302},[260,2180,2181],{"class":298}," >",[260,2183,2184],{"class":567}," 2000",[260,2186,838],{"class":384},[260,2188,1819],{"class":302},[260,2190,502],{"class":298},[260,2192,2193],{"class":302},"shouldKeep",[260,2195,638],{"class":298},[260,2197,2198],{"class":542}," true\n",[260,2200,2201],{"class":262,"line":368},[260,2202,1871],{"class":298},[260,2204,2205,2207],{"class":262,"line":381},[260,2206,412],{"class":298},[260,2208,1878],{"class":302},[242,2210,2212],{"id":2211},"route-filtering","Route Filtering",[225,2214,2215,2216,2219,2220,2223],{},"Control which routes are logged with ",[229,2217,2218],{},"include"," and ",[229,2221,2222],{},"exclude"," patterns:",[251,2225,2227],{"className":284,"code":2226,"filename":286,"language":287,"meta":256,"style":256},"app.use(evlog({\n  include: ['/api/**'],\n  exclude: ['/_internal/**', '/health'],\n  routes: {\n    '/api/auth/**': { service: 'auth-service' },\n    '/api/payment/**': { service: 'payment-service' },\n  },\n}))\n",[229,2228,2229,2245,2267,2295,2304,2331,2357,2361],{"__ignoreMap":256},[260,2230,2231,2233,2235,2237,2239,2241,2243],{"class":262,"line":263},[260,2232,594],{"class":302},[260,2234,502],{"class":298},[260,2236,450],{"class":371},[260,2238,375],{"class":302},[260,2240,337],{"class":371},[260,2242,375],{"class":302},[260,2244,378],{"class":298},[260,2246,2247,2250,2252,2255,2257,2260,2262,2265],{"class":262,"line":321},[260,2248,2249],{"class":384},"  include",[260,2251,388],{"class":298},[260,2253,2254],{"class":302}," [",[260,2256,403],{"class":298},[260,2258,2259],{"class":270},"/api/**",[260,2261,403],{"class":298},[260,2263,2264],{"class":302},"]",[260,2266,1414],{"class":298},[260,2268,2269,2272,2274,2276,2278,2281,2283,2285,2287,2289,2291,2293],{"class":262,"line":342},[260,2270,2271],{"class":384},"  exclude",[260,2273,388],{"class":298},[260,2275,2254],{"class":302},[260,2277,403],{"class":298},[260,2279,2280],{"class":270},"/_internal/**",[260,2282,403],{"class":298},[260,2284,477],{"class":298},[260,2286,312],{"class":298},[260,2288,472],{"class":270},[260,2290,403],{"class":298},[260,2292,2264],{"class":302},[260,2294,1414],{"class":298},[260,2296,2297,2300,2302],{"class":262,"line":361},[260,2298,2299],{"class":384},"  routes",[260,2301,388],{"class":298},[260,2303,493],{"class":298},[260,2305,2306,2309,2312,2314,2316,2318,2320,2322,2324,2327,2329],{"class":262,"line":368},[260,2307,2308],{"class":298},"    '",[260,2310,2311],{"class":384},"/api/auth/**",[260,2313,403],{"class":298},[260,2315,388],{"class":298},[260,2317,299],{"class":298},[260,2319,393],{"class":384},[260,2321,388],{"class":298},[260,2323,312],{"class":298},[260,2325,2326],{"class":270},"auth-service",[260,2328,403],{"class":298},[260,2330,406],{"class":298},[260,2332,2333,2335,2338,2340,2342,2344,2346,2348,2350,2353,2355],{"class":262,"line":381},[260,2334,2308],{"class":298},[260,2336,2337],{"class":384},"/api/payment/**",[260,2339,403],{"class":298},[260,2341,388],{"class":298},[260,2343,299],{"class":298},[260,2345,393],{"class":384},[260,2347,388],{"class":298},[260,2349,312],{"class":298},[260,2351,2352],{"class":270},"payment-service",[260,2354,403],{"class":298},[260,2356,406],{"class":298},[260,2358,2359],{"class":262,"line":409},[260,2360,1871],{"class":298},[260,2362,2363,2365],{"class":262,"line":418},[260,2364,412],{"class":298},[260,2366,1878],{"class":302},[242,2368,2370],{"id":2369},"client-side-logging","Client-Side Logging",[225,2372,942,2373,2376],{},[229,2374,2375],{},"evlog/browser"," to send structured logs from any frontend to your Elysia server. This works with any client framework (React, Vue, Svelte, vanilla JS).",[246,2378,2380],{"id":2379},"browser-setup","Browser setup",[251,2382,2385],{"className":284,"code":2383,"filename":2384,"language":287,"meta":256,"style":256},"import { initLogger, log } from 'evlog'\nimport { createBrowserLogDrain } from 'evlog/browser'\n\nconst drain = createBrowserLogDrain({\n  drain: { endpoint: '/v1/ingest' },\n})\ninitLogger({ drain })\n\nlog.info({ action: 'page_view', path: location.pathname })\n","client.ts",[229,2386,2387,2409,2428,2432,2446,2468,2474,2488,2492],{"__ignoreMap":256},[260,2388,2389,2391,2393,2395,2397,2399,2401,2403,2405,2407],{"class":262,"line":263},[260,2390,295],{"class":294},[260,2392,299],{"class":298},[260,2394,328],{"class":302},[260,2396,477],{"class":298},[260,2398,484],{"class":302},[260,2400,306],{"class":298},[260,2402,309],{"class":294},[260,2404,312],{"class":298},[260,2406,337],{"class":270},[260,2408,318],{"class":298},[260,2410,2411,2413,2415,2418,2420,2422,2424,2426],{"class":262,"line":321},[260,2412,295],{"class":294},[260,2414,299],{"class":298},[260,2416,2417],{"class":302}," createBrowserLogDrain",[260,2419,306],{"class":298},[260,2421,309],{"class":294},[260,2423,312],{"class":298},[260,2425,2375],{"class":270},[260,2427,318],{"class":298},[260,2429,2430],{"class":262,"line":342},[260,2431,365],{"emptyLinePlaceholder":364},[260,2433,2434,2436,2438,2440,2442,2444],{"class":262,"line":361},[260,2435,427],{"class":426},[260,2437,2042],{"class":302},[260,2439,433],{"class":298},[260,2441,2417],{"class":371},[260,2443,375],{"class":302},[260,2445,378],{"class":298},[260,2447,2448,2450,2452,2454,2457,2459,2461,2464,2466],{"class":262,"line":368},[260,2449,1797],{"class":384},[260,2451,388],{"class":298},[260,2453,299],{"class":298},[260,2455,2456],{"class":384}," endpoint",[260,2458,388],{"class":298},[260,2460,312],{"class":298},[260,2462,2463],{"class":270},"/v1/ingest",[260,2465,403],{"class":298},[260,2467,406],{"class":298},[260,2469,2470,2472],{"class":262,"line":381},[260,2471,412],{"class":298},[260,2473,415],{"class":302},[260,2475,2476,2478,2480,2482,2484,2486],{"class":262,"line":409},[260,2477,372],{"class":371},[260,2479,375],{"class":302},[260,2481,510],{"class":298},[260,2483,2042],{"class":302},[260,2485,412],{"class":298},[260,2487,415],{"class":302},[260,2489,2490],{"class":262,"line":418},[260,2491,365],{"emptyLinePlaceholder":364},[260,2493,2494,2496,2498,2500,2502,2504,2507,2509,2511,2514,2516,2518,2521,2523,2526,2528,2531,2533],{"class":262,"line":423},[260,2495,235],{"class":302},[260,2497,502],{"class":298},[260,2499,2084],{"class":371},[260,2501,375],{"class":302},[260,2503,510],{"class":298},[260,2505,2506],{"class":384}," action",[260,2508,388],{"class":298},[260,2510,312],{"class":298},[260,2512,2513],{"class":270},"page_view",[260,2515,403],{"class":298},[260,2517,477],{"class":298},[260,2519,2520],{"class":384}," path",[260,2522,388],{"class":298},[260,2524,2525],{"class":302}," location",[260,2527,502],{"class":298},[260,2529,2530],{"class":302},"pathname ",[260,2532,412],{"class":298},[260,2534,415],{"class":302},[246,2536,2538],{"id":2537},"ingest-endpoint","Ingest endpoint",[225,2540,2541,2542,2545],{},"Add a POST route to receive batched ",[229,2543,2544],{},"DrainContext[]"," from the browser:",[251,2547,2549],{"className":284,"code":2548,"filename":286,"language":287,"meta":256,"style":256},"import type { DrainContext } from 'evlog'\n\napp.post('/v1/ingest', async ({ body }) => {\n  const batch = body as DrainContext[]\n  for (const ctx of batch) {\n    console.log('[BROWSER]', JSON.stringify(ctx.event))\n  }\n  return new Response(null, { status: 204 })\n})\n",[229,2550,2551,2571,2575,2607,2626,2646,2684,2689,2717],{"__ignoreMap":256},[260,2552,2553,2555,2557,2559,2561,2563,2565,2567,2569],{"class":262,"line":263},[260,2554,295],{"class":294},[260,2556,1901],{"class":294},[260,2558,299],{"class":298},[260,2560,1906],{"class":302},[260,2562,306],{"class":298},[260,2564,309],{"class":294},[260,2566,312],{"class":298},[260,2568,337],{"class":270},[260,2570,318],{"class":298},[260,2572,2573],{"class":262,"line":321},[260,2574,365],{"emptyLinePlaceholder":364},[260,2576,2577,2579,2581,2584,2586,2588,2590,2592,2594,2596,2598,2601,2603,2605],{"class":262,"line":342},[260,2578,594],{"class":302},[260,2580,502],{"class":298},[260,2582,2583],{"class":371},"post",[260,2585,375],{"class":302},[260,2587,403],{"class":298},[260,2589,2463],{"class":270},[260,2591,403],{"class":298},[260,2593,477],{"class":298},[260,2595,612],{"class":426},[260,2597,480],{"class":298},[260,2599,2600],{"class":483}," body",[260,2602,487],{"class":298},[260,2604,490],{"class":426},[260,2606,493],{"class":298},[260,2608,2609,2611,2614,2616,2618,2621,2623],{"class":262,"line":361},[260,2610,632],{"class":426},[260,2612,2613],{"class":302}," batch",[260,2615,638],{"class":298},[260,2617,2600],{"class":302},[260,2619,2620],{"class":294}," as",[260,2622,1906],{"class":266},[260,2624,2625],{"class":384},"[]\n",[260,2627,2628,2631,2633,2635,2637,2640,2642,2644],{"class":262,"line":368},[260,2629,2630],{"class":294},"  for",[260,2632,1816],{"class":384},[260,2634,427],{"class":426},[260,2636,2174],{"class":302},[260,2638,2639],{"class":298}," of",[260,2641,2613],{"class":302},[260,2643,838],{"class":384},[260,2645,378],{"class":298},[260,2647,2648,2651,2653,2655,2657,2659,2662,2664,2666,2669,2671,2674,2676,2678,2680,2682],{"class":262,"line":381},[260,2649,2650],{"class":302},"    console",[260,2652,502],{"class":298},[260,2654,235],{"class":371},[260,2656,375],{"class":384},[260,2658,403],{"class":298},[260,2660,2661],{"class":270},"[BROWSER]",[260,2663,403],{"class":298},[260,2665,477],{"class":298},[260,2667,2668],{"class":302}," JSON",[260,2670,502],{"class":298},[260,2672,2673],{"class":371},"stringify",[260,2675,375],{"class":384},[260,2677,1819],{"class":302},[260,2679,502],{"class":298},[260,2681,1846],{"class":302},[260,2683,1878],{"class":384},[260,2685,2686],{"class":262,"line":409},[260,2687,2688],{"class":298},"  }\n",[260,2690,2691,2693,2695,2698,2700,2703,2705,2708,2710,2713,2715],{"class":262,"line":418},[260,2692,853],{"class":294},[260,2694,436],{"class":298},[260,2696,2697],{"class":371}," Response",[260,2699,375],{"class":384},[260,2701,2702],{"class":298},"null,",[260,2704,299],{"class":298},[260,2706,2707],{"class":384}," status",[260,2709,388],{"class":298},[260,2711,2712],{"class":567}," 204",[260,2714,306],{"class":298},[260,2716,415],{"class":384},[260,2718,2719,2721],{"class":262,"line":423},[260,2720,412],{"class":298},[260,2722,415],{"class":302},[2082,2724,2726,2727,2730],{"color":2725,"icon":187},"neutral","See the full ",[2091,2728,2729],{"href":185},"Browser Drain"," adapter docs for batching, retry, sendBeacon fallback, and authentication options.",[242,2732,2734],{"id":2733},"run-locally","Run Locally",[251,2736,2738],{"className":253,"code":2737,"language":255,"meta":256,"style":256},"git clone https://github.com/HugoRCD/evlog.git\ncd evlog\nbun install\nbun run example:elysia\n",[229,2739,2740,2751,2759,2766],{"__ignoreMap":256},[260,2741,2742,2745,2748],{"class":262,"line":263},[260,2743,2744],{"class":266},"git",[260,2746,2747],{"class":270}," clone",[260,2749,2750],{"class":270}," https://github.com/HugoRCD/evlog.git\n",[260,2752,2753,2756],{"class":262,"line":321},[260,2754,2755],{"class":371},"cd",[260,2757,2758],{"class":270}," evlog\n",[260,2760,2761,2763],{"class":262,"line":342},[260,2762,267],{"class":266},[260,2764,2765],{"class":270}," install\n",[260,2767,2768,2770,2773],{"class":262,"line":361},[260,2769,267],{"class":266},[260,2771,2772],{"class":270}," run",[260,2774,2775],{"class":270}," example:elysia\n",[225,2777,2778,2779,2784],{},"Open ",[2091,2780,2781],{"href":2781,"rel":2782},"http://localhost:3000",[2783],"nofollow"," to explore the interactive test UI.",[2786,2787,2788],"card-group",{},[2789,2790,2793],"card",{"icon":89,"title":2791,"to":2792},"Source Code","https://github.com/HugoRCD/evlog/tree/main/examples/elysia","Browse the complete Elysia example source on GitHub.",[2795,2796,2797],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":256,"searchDepth":321,"depth":321,"links":2799},[2800,2804,2805,2806,2807,2810,2811,2812,2816],{"id":244,"depth":321,"text":20,"children":2801},[2802,2803],{"id":248,"depth":342,"text":249},{"id":280,"depth":342,"text":281},{"id":581,"depth":321,"text":111},{"id":939,"depth":321,"text":239},{"id":1240,"depth":321,"text":1241},{"id":1706,"depth":321,"text":1707,"children":2808},[2809],{"id":1881,"depth":342,"text":1882},{"id":2097,"depth":321,"text":2098},{"id":2211,"depth":321,"text":2212},{"id":2369,"depth":321,"text":2370,"children":2813},[2814,2815],{"id":2379,"depth":342,"text":2380},{"id":2537,"depth":342,"text":2538},{"id":2733,"depth":321,"text":2734},"Using evlog with Elysia — automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Elysia applications.","md",[2820],{"label":2791,"icon":2821,"to":2792,"color":2725,"variant":2822},"i-simple-icons-github","subtle",{},{"title":86,"icon":89},{"title":86,"description":2817},"ys5iNrZuJ2VhQEWvJDM0p07wRllB30sBG95vfaB45lY",[2828,2830],{"title":81,"path":82,"stem":83,"description":2829,"icon":84,"children":-1},"Using evlog with Fastify — automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Fastify applications.",{"title":91,"path":92,"stem":93,"description":2831,"icon":94,"children":-1},"Using evlog with Cloudflare Workers — wide events, structured errors, and logging in Workers and Durable Objects.",1772991604530]