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