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