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