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