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