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