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