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