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