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