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