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