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