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