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