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