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