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