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