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