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