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