[{"data":1,"prerenderedAt":3863},["ShallowReactive",2],{"navigation_docs":3,"-integrate-frameworks-express":612,"-integrate-frameworks-express-surround":3858},[4,35,85,148,328,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,138,143],{"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},"logs","\u002Fcli\u002Flogs","3.cli\u002F10.logs","i-lucide-scroll-text",{"title":104,"path":105,"stem":106,"icon":107},"config","\u002Fcli\u002Fconfig","3.cli\u002F11.config","i-lucide-settings-2",{"title":109,"path":110,"stem":111,"icon":112},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":114,"path":115,"stem":116,"icon":117},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":119,"path":120,"stem":121,"icon":122},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":124,"path":125,"stem":126,"icon":127},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":129,"path":130,"stem":131,"icon":132},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":134,"path":135,"stem":136,"icon":137},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":139,"path":140,"stem":141,"icon":142},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":144,"path":145,"stem":146,"icon":147},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":149,"path":150,"stem":151,"children":152,"page":34},"Integrate","\u002Fintegrate","4.integrate",[153,157,240],{"title":41,"path":154,"stem":155,"icon":156},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":158,"path":159,"stem":160,"children":161,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[162,165,195,220],{"title":41,"path":163,"stem":164,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":166,"path":167,"stem":168,"children":169,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[170,175,180,185,190],{"title":171,"path":172,"stem":173,"icon":174},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":176,"path":177,"stem":178,"icon":179},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":181,"path":182,"stem":183,"icon":184},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":186,"path":187,"stem":188,"icon":189},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":191,"path":192,"stem":193,"icon":194},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":196,"path":197,"stem":198,"children":199,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[200,205,210,215],{"title":201,"path":202,"stem":203,"icon":204},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":206,"path":207,"stem":208,"icon":209},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":211,"path":212,"stem":213,"icon":214},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":216,"path":217,"stem":218,"icon":219},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":221,"path":222,"stem":223,"children":224,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[225,230,235],{"title":226,"path":227,"stem":228,"icon":229},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":231,"path":232,"stem":233,"icon":234},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":236,"path":237,"stem":238,"icon":239},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":241,"path":242,"stem":243,"children":244,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[245,249,254,259,264,269,274,279,284,289,294,299,304,309,313,318,323],{"title":41,"path":246,"stem":247,"icon":248},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":250,"path":251,"stem":252,"icon":253},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":255,"path":256,"stem":257,"icon":258},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":260,"path":261,"stem":262,"icon":263},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":265,"path":266,"stem":267,"icon":268},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":270,"path":271,"stem":272,"icon":273},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":275,"path":276,"stem":277,"icon":278},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":280,"path":281,"stem":282,"icon":283},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":285,"path":286,"stem":287,"icon":288},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":290,"path":291,"stem":292,"icon":293},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":295,"path":296,"stem":297,"icon":298},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":300,"path":301,"stem":302,"icon":303},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":305,"path":306,"stem":307,"icon":308},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":310,"path":311,"stem":312,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":314,"path":315,"stem":316,"icon":317},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":319,"path":320,"stem":321,"icon":322},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":324,"path":325,"stem":326,"icon":327},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":329,"path":330,"stem":331,"children":332,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[333,336,341,369,396,428,449,454,459,463],{"title":41,"path":334,"stem":335,"icon":117},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":337,"path":338,"stem":339,"icon":340},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":342,"icon":343,"path":344,"stem":345,"children":346,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[347,350,355,360,365],{"title":41,"path":348,"stem":349,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":351,"path":352,"stem":353,"icon":354},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":356,"path":357,"stem":358,"icon":359},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":361,"path":362,"stem":363,"icon":364},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":366,"path":367,"stem":368,"icon":147},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":370,"icon":371,"path":372,"stem":373,"children":374,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[375,378,383,388,392],{"title":41,"path":376,"stem":377,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":379,"path":380,"stem":381,"icon":382},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":384,"path":385,"stem":386,"icon":387},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":389,"path":390,"stem":391,"icon":340},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":393,"path":394,"stem":395,"icon":122},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":397,"icon":398,"path":399,"stem":400,"children":401,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[402,405,410,415,420,424],{"title":41,"path":403,"stem":404,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":406,"path":407,"stem":408,"icon":409},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":411,"path":412,"stem":413,"icon":414},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":416,"path":417,"stem":418,"icon":419},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":421,"path":422,"stem":423,"icon":398},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":425,"path":426,"stem":427,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":366,"icon":122,"path":429,"stem":430,"children":431,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[432,435,440,445],{"title":41,"path":433,"stem":434,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":436,"path":437,"stem":438,"icon":439},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":441,"path":442,"stem":443,"icon":444},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":446,"path":447,"stem":448,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":450,"path":451,"stem":452,"icon":453},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":455,"path":456,"stem":457,"icon":458},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":460,"path":461,"stem":462,"icon":444},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":464,"icon":465,"path":466,"stem":467,"children":468,"page":34},"Signals","i-lucide-scan-search","\u002Fuse-cases\u002Fsignals","5.use-cases\u002F7.signals",[469,472,477,482,485],{"title":41,"path":470,"stem":471,"icon":44},"\u002Fuse-cases\u002Fsignals\u002Foverview","5.use-cases\u002F7.signals\u002F01.overview",{"title":473,"path":474,"stem":475,"icon":476},"What You Can Ask","\u002Fuse-cases\u002Fsignals\u002Fask","5.use-cases\u002F7.signals\u002F02.ask","i-lucide-message-circle-question",{"title":478,"path":479,"stem":480,"icon":481},"What It Costs","\u002Fuse-cases\u002Fsignals\u002Fcost","5.use-cases\u002F7.signals\u002F03.cost","i-lucide-coins",{"title":446,"path":483,"stem":484,"icon":84},"\u002Fuse-cases\u002Fsignals\u002Freference","5.use-cases\u002F7.signals\u002F04.reference",{"title":425,"path":486,"stem":487,"icon":488},"\u002Fuse-cases\u002Fsignals\u002Frecipes","5.use-cases\u002F7.signals\u002F05.recipes","i-lucide-lightbulb",{"title":490,"path":491,"stem":492,"children":493,"page":34},"Extend","\u002Fextend","6.extend",[494,498,503,508,512,517,521,525,529,533,538,543],{"title":41,"path":495,"stem":496,"icon":497},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":499,"path":500,"stem":501,"icon":502},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":504,"path":505,"stem":506,"icon":507},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":509,"path":510,"stem":511,"icon":502},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":513,"path":514,"stem":515,"icon":516},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":425,"path":518,"stem":519,"icon":520},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":522,"path":523,"stem":524,"icon":497},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":526,"path":527,"stem":528,"icon":453},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":530,"path":531,"stem":532,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":534,"path":535,"stem":536,"icon":537},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":539,"path":540,"stem":541,"icon":542},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":544,"path":545,"stem":546,"icon":547},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":446,"path":549,"stem":550,"children":551,"page":34},"\u002Freference","7.reference",[552,556,561,564,569,573,578,582],{"title":41,"path":553,"stem":554,"icon":555},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":557,"path":558,"stem":559,"icon":560},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":393,"path":562,"stem":563,"icon":122},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":565,"path":566,"stem":567,"icon":568},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":570,"path":571,"stem":572,"icon":398},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":574,"path":575,"stem":576,"icon":577},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":579,"path":580,"stem":581,"icon":453},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":583,"path":584,"stem":585,"icon":586},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"title":588,"path":589,"stem":590,"children":591,"page":34},"Compare","\u002Fcompare","8.compare",[592,596,600,604,608],{"title":593,"path":594,"stem":595,"icon":577},"evlog vs Pino","\u002Fcompare\u002Fpino","8.compare\u002F1.pino",{"title":597,"path":598,"stem":599,"icon":214},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","8.compare\u002F2.opentelemetry",{"title":601,"path":602,"stem":603,"icon":577},"evlog vs LogTape","\u002Fcompare\u002Flogtape","8.compare\u002F3.logtape",{"title":605,"path":606,"stem":607,"icon":577},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","8.compare\u002F4.winston",{"title":609,"path":610,"stem":611,"icon":577},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","8.compare\u002F5.consola",{"id":613,"title":280,"body":614,"description":3849,"extension":3850,"links":3851,"meta":3854,"navigation":3855,"path":281,"seo":3856,"stem":282,"__hash__":3857},"docs\u002F4.integrate\u002Fframeworks\u002F07.express.md",{"type":615,"value":616,"toc":3824},"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,2531,2664,2690,2694,2697,2864,2868,2875,3067,3078,3082,3088,3192,3196,3206,3349,3353,3359,3363,3517,3521,3528,3708,3718,3722,3763,3771,3781,3785,3791,3820],[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":283},"[\"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.).",[682,2516,2518],{"id":2517},"keep-the-options-in-evlogconfigts","Keep the options in evlog.config.ts",[618,2520,2521,2522,2527,2528,2530],{},"The options can live in an ",[667,2523,2524],{"href":105},[622,2525,2526],{},"evlog.config.ts"," at the root of the app, the file the CLI reads too. Import it where you call ",[622,2529,857],{}," and where you register the middleware:",[690,2532,2534],{"className":772,"code":2533,"filename":774,"language":775,"meta":696,"style":696},"import express from 'express'\nimport { initLogger, toLoggerConfig, toMiddlewareOptions } from 'evlog'\nimport { evlog } from 'evlog\u002Fexpress'\nimport config from '..\u002Fevlog.config'\n\ninitLogger(toLoggerConfig(config))\n\nconst app = express()\napp.use(evlog(toMiddlewareOptions(config)))\n",[622,2535,2536,2550,2578,2596,2612,2616,2628,2632,2644],{"__ignoreMap":696},[700,2537,2538,2540,2542,2544,2546,2548],{"class":702,"line":703},[700,2539,783],{"class":782},[700,2541,787],{"class":786},[700,2543,790],{"class":782},[700,2545,794],{"class":793},[700,2547,797],{"class":709},[700,2549,800],{"class":793},[700,2551,2552,2554,2556,2558,2560,2563,2565,2568,2570,2572,2574,2576],{"class":702,"line":803},[700,2553,783],{"class":782},[700,2555,808],{"class":793},[700,2557,811],{"class":786},[700,2559,975],{"class":793},[700,2561,2562],{"class":786}," toLoggerConfig",[700,2564,975],{"class":793},[700,2566,2567],{"class":786}," toMiddlewareOptions",[700,2569,814],{"class":793},[700,2571,817],{"class":782},[700,2573,794],{"class":793},[700,2575,822],{"class":709},[700,2577,800],{"class":793},[700,2579,2580,2582,2584,2586,2588,2590,2592,2594],{"class":702,"line":827},[700,2581,783],{"class":782},[700,2583,808],{"class":793},[700,2585,713],{"class":786},[700,2587,814],{"class":793},[700,2589,817],{"class":782},[700,2591,794],{"class":793},[700,2593,624],{"class":709},[700,2595,800],{"class":793},[700,2597,2598,2600,2603,2605,2607,2610],{"class":702,"line":846},[700,2599,783],{"class":782},[700,2601,2602],{"class":786}," config ",[700,2604,790],{"class":782},[700,2606,794],{"class":793},[700,2608,2609],{"class":709},"..\u002Fevlog.config",[700,2611,800],{"class":793},[700,2613,2614],{"class":702,"line":853},[700,2615,850],{"emptyLinePlaceholder":849},[700,2617,2618,2620,2622,2625],{"class":702,"line":866},[700,2619,857],{"class":856},[700,2621,860],{"class":786},[700,2623,2624],{"class":856},"toLoggerConfig",[700,2626,2627],{"class":786},"(config))\n",[700,2629,2630],{"class":702,"line":894},[700,2631,850],{"emptyLinePlaceholder":849},[700,2633,2634,2636,2638,2640,2642],{"class":702,"line":903},[700,2635,912],{"class":911},[700,2637,915],{"class":786},[700,2639,918],{"class":793},[700,2641,921],{"class":856},[700,2643,924],{"class":786},[700,2645,2646,2648,2650,2652,2654,2656,2658,2661],{"class":702,"line":908},[700,2647,935],{"class":786},[700,2649,938],{"class":793},[700,2651,941],{"class":856},[700,2653,860],{"class":786},[700,2655,822],{"class":856},[700,2657,860],{"class":786},[700,2659,2660],{"class":856},"toMiddlewareOptions",[700,2662,2663],{"class":786},"(config)))\n",[618,2665,2666,2668,2669,2671,2672,2674,2675,2678,2679,2682,2683,2689],{},[622,2667,2624],{}," keeps the options ",[622,2670,857],{}," takes and ",[622,2673,2660],{}," the ones ",[622,2676,2677],{},"evlog()"," takes, so the sampling, drain, ",[622,2680,2681],{},"enrich"," and route filters of the file all apply. ",[667,2684,2686],{"href":2685},"\u002Fcli\u002Finit#per-framework",[622,2687,2688],{},"evlog init"," writes this wiring for you.",[678,2691,2693],{"id":2692},"drain-enrichers","Drain & Enrichers",[618,2695,2696],{},"Configure drain adapters and enrichers directly in the middleware options:",[690,2698,2700],{"className":772,"code":2699,"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,2701,2702,2722,2742,2746,2759,2763,2779,2793,2811,2822,2852,2857],{"__ignoreMap":696},[700,2703,2704,2706,2708,2711,2713,2715,2717,2720],{"class":702,"line":703},[700,2705,783],{"class":782},[700,2707,808],{"class":793},[700,2709,2710],{"class":786}," createAxiomDrain",[700,2712,814],{"class":793},[700,2714,817],{"class":782},[700,2716,794],{"class":793},[700,2718,2719],{"class":709},"evlog\u002Faxiom",[700,2721,800],{"class":793},[700,2723,2724,2726,2728,2731,2733,2735,2737,2740],{"class":702,"line":803},[700,2725,783],{"class":782},[700,2727,808],{"class":793},[700,2729,2730],{"class":786}," createUserAgentEnricher",[700,2732,814],{"class":793},[700,2734,817],{"class":782},[700,2736,794],{"class":793},[700,2738,2739],{"class":709},"evlog\u002Fenrichers",[700,2741,800],{"class":793},[700,2743,2744],{"class":702,"line":827},[700,2745,850],{"emptyLinePlaceholder":849},[700,2747,2748,2750,2753,2755,2757],{"class":702,"line":846},[700,2749,912],{"class":911},[700,2751,2752],{"class":786}," userAgent ",[700,2754,918],{"class":793},[700,2756,2730],{"class":856},[700,2758,924],{"class":786},[700,2760,2761],{"class":702,"line":853},[700,2762,850],{"emptyLinePlaceholder":849},[700,2764,2765,2767,2769,2771,2773,2775,2777],{"class":702,"line":866},[700,2766,935],{"class":786},[700,2768,938],{"class":793},[700,2770,941],{"class":856},[700,2772,860],{"class":786},[700,2774,822],{"class":856},[700,2776,860],{"class":786},[700,2778,863],{"class":793},[700,2780,2781,2784,2786,2788,2791],{"class":702,"line":894},[700,2782,2783],{"class":869},"  drain",[700,2785,873],{"class":793},[700,2787,2710],{"class":856},[700,2789,2790],{"class":786},"()",[700,2792,2199],{"class":793},[700,2794,2795,2798,2800,2802,2805,2807,2809],{"class":702,"line":903},[700,2796,2797],{"class":856},"  enrich",[700,2799,873],{"class":793},[700,2801,978],{"class":793},[700,2803,2804],{"class":981},"ctx",[700,2806,990],{"class":793},[700,2808,993],{"class":911},[700,2810,996],{"class":793},[700,2812,2813,2816,2818,2820],{"class":702,"line":908},[700,2814,2815],{"class":856},"    userAgent",[700,2817,860],{"class":869},[700,2819,2804],{"class":786},[700,2821,900],{"class":869},[700,2823,2824,2827,2829,2832,2834,2837,2839,2842,2844,2847,2849],{"class":702,"line":927},[700,2825,2826],{"class":786},"    ctx",[700,2828,938],{"class":793},[700,2830,2831],{"class":786},"event",[700,2833,938],{"class":793},[700,2835,2836],{"class":786},"region",[700,2838,1179],{"class":793},[700,2840,2841],{"class":786}," process",[700,2843,938],{"class":793},[700,2845,2846],{"class":786},"env",[700,2848,938],{"class":793},[700,2850,2851],{"class":786},"FLY_REGION\n",[700,2853,2854],{"class":702,"line":932},[700,2855,2856],{"class":793},"  },\n",[700,2858,2859,2861],{"class":702,"line":951},[700,2860,897],{"class":793},[700,2862,2863],{"class":786},"))\n",[682,2865,2867],{"id":2866},"pipeline-batching-retry","Pipeline (Batching & Retry)",[618,2869,2870,2871,2874],{},"For production, wrap your adapter with ",[622,2872,2873],{},"createDrainPipeline"," to batch events and retry on failure:",[690,2876,2878],{"className":772,"code":2877,"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,2879,2880,2902,2920,2940,2944,2968,2997,3016,3022,3041,3045],{"__ignoreMap":696},[700,2881,2882,2884,2887,2889,2892,2894,2896,2898,2900],{"class":702,"line":703},[700,2883,783],{"class":782},[700,2885,2886],{"class":782}," type",[700,2888,808],{"class":793},[700,2890,2891],{"class":786}," DrainContext",[700,2893,814],{"class":793},[700,2895,817],{"class":782},[700,2897,794],{"class":793},[700,2899,822],{"class":709},[700,2901,800],{"class":793},[700,2903,2904,2906,2908,2910,2912,2914,2916,2918],{"class":702,"line":803},[700,2905,783],{"class":782},[700,2907,808],{"class":793},[700,2909,2710],{"class":786},[700,2911,814],{"class":793},[700,2913,817],{"class":782},[700,2915,794],{"class":793},[700,2917,2719],{"class":709},[700,2919,800],{"class":793},[700,2921,2922,2924,2926,2929,2931,2933,2935,2938],{"class":702,"line":827},[700,2923,783],{"class":782},[700,2925,808],{"class":793},[700,2927,2928],{"class":786}," createDrainPipeline",[700,2930,814],{"class":793},[700,2932,817],{"class":782},[700,2934,794],{"class":793},[700,2936,2937],{"class":709},"evlog\u002Fpipeline",[700,2939,800],{"class":793},[700,2941,2942],{"class":702,"line":846},[700,2943,850],{"emptyLinePlaceholder":849},[700,2945,2946,2948,2951,2953,2955,2958,2961,2964,2966],{"class":702,"line":853},[700,2947,912],{"class":911},[700,2949,2950],{"class":786}," pipeline ",[700,2952,918],{"class":793},[700,2954,2928],{"class":856},[700,2956,2957],{"class":793},"\u003C",[700,2959,2960],{"class":706},"DrainContext",[700,2962,2963],{"class":793},">",[700,2965,860],{"class":786},[700,2967,863],{"class":793},[700,2969,2970,2973,2975,2977,2980,2982,2985,2987,2990,2992,2995],{"class":702,"line":866},[700,2971,2972],{"class":869},"  batch",[700,2974,873],{"class":793},[700,2976,808],{"class":793},[700,2978,2979],{"class":869}," size",[700,2981,873],{"class":793},[700,2983,2984],{"class":1088}," 50",[700,2986,975],{"class":793},[700,2988,2989],{"class":869}," intervalMs",[700,2991,873],{"class":793},[700,2993,2994],{"class":1088}," 5000",[700,2996,891],{"class":793},[700,2998,2999,3002,3004,3006,3009,3011,3014],{"class":702,"line":894},[700,3000,3001],{"class":869},"  retry",[700,3003,873],{"class":793},[700,3005,808],{"class":793},[700,3007,3008],{"class":869}," maxAttempts",[700,3010,873],{"class":793},[700,3012,3013],{"class":1088}," 3",[700,3015,891],{"class":793},[700,3017,3018,3020],{"class":702,"line":903},[700,3019,897],{"class":793},[700,3021,900],{"class":786},[700,3023,3024,3026,3029,3031,3034,3036,3039],{"class":702,"line":908},[700,3025,912],{"class":911},[700,3027,3028],{"class":786}," drain ",[700,3030,918],{"class":793},[700,3032,3033],{"class":856}," pipeline",[700,3035,860],{"class":786},[700,3037,3038],{"class":856},"createAxiomDrain",[700,3040,948],{"class":786},[700,3042,3043],{"class":702,"line":927},[700,3044,850],{"emptyLinePlaceholder":849},[700,3046,3047,3049,3051,3053,3055,3057,3059,3061,3063,3065],{"class":702,"line":932},[700,3048,935],{"class":786},[700,3050,938],{"class":793},[700,3052,941],{"class":856},[700,3054,860],{"class":786},[700,3056,822],{"class":856},[700,3058,860],{"class":786},[700,3060,1017],{"class":793},[700,3062,3028],{"class":786},[700,3064,897],{"class":793},[700,3066,2863],{"class":786},[1093,3068,3069,3070,3073,3074,3077],{"color":1095,"icon":13},"Call ",[622,3071,3072],{},"drain.flush()"," on server shutdown to ensure all buffered events are sent. See the ",[667,3075,3076],{"href":545},"Pipeline docs"," for all options.",[678,3079,3081],{"id":3080},"tail-sampling","Tail Sampling",[618,3083,1508,3084,3087],{},[622,3085,3086],{},"keep"," to force-retain specific events regardless of head sampling:",[690,3089,3091],{"className":772,"code":3090,"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,3092,3093,3109,3121,3138,3182,3186],{"__ignoreMap":696},[700,3094,3095,3097,3099,3101,3103,3105,3107],{"class":702,"line":703},[700,3096,935],{"class":786},[700,3098,938],{"class":793},[700,3100,941],{"class":856},[700,3102,860],{"class":786},[700,3104,822],{"class":856},[700,3106,860],{"class":786},[700,3108,863],{"class":793},[700,3110,3111,3113,3115,3117,3119],{"class":702,"line":803},[700,3112,2783],{"class":869},[700,3114,873],{"class":793},[700,3116,2710],{"class":856},[700,3118,2790],{"class":786},[700,3120,2199],{"class":793},[700,3122,3123,3126,3128,3130,3132,3134,3136],{"class":702,"line":827},[700,3124,3125],{"class":856},"  keep",[700,3127,873],{"class":793},[700,3129,978],{"class":793},[700,3131,2804],{"class":981},[700,3133,990],{"class":793},[700,3135,993],{"class":911},[700,3137,996],{"class":793},[700,3139,3140,3143,3145,3147,3149,3152,3155,3158,3160,3162,3165,3168,3170,3172,3174,3177,3179],{"class":702,"line":846},[700,3141,3142],{"class":782},"    if",[700,3144,978],{"class":869},[700,3146,2804],{"class":786},[700,3148,938],{"class":793},[700,3150,3151],{"class":786},"duration",[700,3153,3154],{"class":793}," &&",[700,3156,3157],{"class":786}," ctx",[700,3159,938],{"class":793},[700,3161,3151],{"class":786},[700,3163,3164],{"class":793}," >",[700,3166,3167],{"class":1088}," 2000",[700,3169,1396],{"class":869},[700,3171,2804],{"class":786},[700,3173,938],{"class":793},[700,3175,3176],{"class":786},"shouldKeep",[700,3178,1179],{"class":793},[700,3180,3181],{"class":1056}," true\n",[700,3183,3184],{"class":702,"line":853},[700,3185,2856],{"class":793},[700,3187,3188,3190],{"class":702,"line":866},[700,3189,897],{"class":793},[700,3191,2863],{"class":786},[678,3193,3195],{"id":3194},"route-filtering","Route Filtering",[618,3197,3198,3199,1814,3202,3205],{},"Control which routes are logged with ",[622,3200,3201],{},"include",[622,3203,3204],{},"exclude"," patterns:",[690,3207,3209],{"className":772,"code":3208,"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,3210,3211,3227,3249,3277,3286,3313,3339,3343],{"__ignoreMap":696},[700,3212,3213,3215,3217,3219,3221,3223,3225],{"class":702,"line":703},[700,3214,935],{"class":786},[700,3216,938],{"class":793},[700,3218,941],{"class":856},[700,3220,860],{"class":786},[700,3222,822],{"class":856},[700,3224,860],{"class":786},[700,3226,863],{"class":793},[700,3228,3229,3232,3234,3237,3239,3242,3244,3247],{"class":702,"line":803},[700,3230,3231],{"class":869},"  include",[700,3233,873],{"class":793},[700,3235,3236],{"class":786}," [",[700,3238,888],{"class":793},[700,3240,3241],{"class":709},"\u002Fapi\u002F**",[700,3243,888],{"class":793},[700,3245,3246],{"class":786},"]",[700,3248,2199],{"class":793},[700,3250,3251,3254,3256,3258,3260,3263,3265,3267,3269,3271,3273,3275],{"class":702,"line":827},[700,3252,3253],{"class":869},"  exclude",[700,3255,873],{"class":793},[700,3257,3236],{"class":786},[700,3259,888],{"class":793},[700,3261,3262],{"class":709},"\u002F_internal\u002F**",[700,3264,888],{"class":793},[700,3266,975],{"class":793},[700,3268,794],{"class":793},[700,3270,970],{"class":709},[700,3272,888],{"class":793},[700,3274,3246],{"class":786},[700,3276,2199],{"class":793},[700,3278,3279,3282,3284],{"class":702,"line":846},[700,3280,3281],{"class":869},"  routes",[700,3283,873],{"class":793},[700,3285,996],{"class":793},[700,3287,3288,3291,3294,3296,3298,3300,3302,3304,3306,3309,3311],{"class":702,"line":853},[700,3289,3290],{"class":793},"    '",[700,3292,3293],{"class":869},"\u002Fapi\u002Fauth\u002F**",[700,3295,888],{"class":793},[700,3297,873],{"class":793},[700,3299,808],{"class":793},[700,3301,878],{"class":869},[700,3303,873],{"class":793},[700,3305,794],{"class":793},[700,3307,3308],{"class":709},"auth-service",[700,3310,888],{"class":793},[700,3312,891],{"class":793},[700,3314,3315,3317,3320,3322,3324,3326,3328,3330,3332,3335,3337],{"class":702,"line":866},[700,3316,3290],{"class":793},[700,3318,3319],{"class":869},"\u002Fapi\u002Fpayment\u002F**",[700,3321,888],{"class":793},[700,3323,873],{"class":793},[700,3325,808],{"class":793},[700,3327,878],{"class":869},[700,3329,873],{"class":793},[700,3331,794],{"class":793},[700,3333,3334],{"class":709},"payment-service",[700,3336,888],{"class":793},[700,3338,891],{"class":793},[700,3340,3341],{"class":702,"line":894},[700,3342,2856],{"class":793},[700,3344,3345,3347],{"class":702,"line":903},[700,3346,897],{"class":793},[700,3348,2863],{"class":786},[678,3350,3352],{"id":3351},"client-side-logging","Client-Side Logging",[618,3354,1508,3355,3358],{},[622,3356,3357],{},"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,3360,3362],{"id":3361},"browser-setup","Browser setup",[690,3364,3367],{"className":772,"code":3365,"filename":3366,"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,3368,3369,3391,3410,3414,3428,3450,3456,3470,3474],{"__ignoreMap":696},[700,3370,3371,3373,3375,3377,3379,3381,3383,3385,3387,3389],{"class":702,"line":703},[700,3372,783],{"class":782},[700,3374,808],{"class":793},[700,3376,811],{"class":786},[700,3378,975],{"class":793},[700,3380,1577],{"class":786},[700,3382,814],{"class":793},[700,3384,817],{"class":782},[700,3386,794],{"class":793},[700,3388,822],{"class":709},[700,3390,800],{"class":793},[700,3392,3393,3395,3397,3400,3402,3404,3406,3408],{"class":702,"line":803},[700,3394,783],{"class":782},[700,3396,808],{"class":793},[700,3398,3399],{"class":786}," createHttpLogDrain",[700,3401,814],{"class":793},[700,3403,817],{"class":782},[700,3405,794],{"class":793},[700,3407,3357],{"class":709},[700,3409,800],{"class":793},[700,3411,3412],{"class":702,"line":827},[700,3413,850],{"emptyLinePlaceholder":849},[700,3415,3416,3418,3420,3422,3424,3426],{"class":702,"line":846},[700,3417,912],{"class":911},[700,3419,3028],{"class":786},[700,3421,918],{"class":793},[700,3423,3399],{"class":856},[700,3425,860],{"class":786},[700,3427,863],{"class":793},[700,3429,3430,3432,3434,3436,3439,3441,3443,3446,3448],{"class":702,"line":853},[700,3431,2783],{"class":869},[700,3433,873],{"class":793},[700,3435,808],{"class":793},[700,3437,3438],{"class":869}," endpoint",[700,3440,873],{"class":793},[700,3442,794],{"class":793},[700,3444,3445],{"class":709},"\u002Fv1\u002Fingest",[700,3447,888],{"class":793},[700,3449,891],{"class":793},[700,3451,3452,3454],{"class":702,"line":866},[700,3453,897],{"class":793},[700,3455,900],{"class":786},[700,3457,3458,3460,3462,3464,3466,3468],{"class":702,"line":894},[700,3459,857],{"class":856},[700,3461,860],{"class":786},[700,3463,1017],{"class":793},[700,3465,3028],{"class":786},[700,3467,897],{"class":793},[700,3469,900],{"class":786},[700,3471,3472],{"class":702,"line":903},[700,3473,850],{"emptyLinePlaceholder":849},[700,3475,3476,3478,3480,3482,3484,3486,3489,3491,3493,3496,3498,3500,3503,3505,3508,3510,3513,3515],{"class":702,"line":908},[700,3477,1007],{"class":786},[700,3479,938],{"class":793},[700,3481,1095],{"class":856},[700,3483,860],{"class":786},[700,3485,1017],{"class":793},[700,3487,3488],{"class":869}," action",[700,3490,873],{"class":793},[700,3492,794],{"class":793},[700,3494,3495],{"class":709},"page_view",[700,3497,888],{"class":793},[700,3499,975],{"class":793},[700,3501,3502],{"class":869}," path",[700,3504,873],{"class":793},[700,3506,3507],{"class":786}," location",[700,3509,938],{"class":793},[700,3511,3512],{"class":786},"pathname ",[700,3514,897],{"class":793},[700,3516,900],{"class":786},[682,3518,3520],{"id":3519},"ingest-endpoint","Ingest endpoint",[618,3522,3523,3524,3527],{},"Add a POST route to receive batched ",[622,3525,3526],{},"DrainContext[]"," from the browser:",[690,3529,3531],{"className":772,"code":3530,"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,3532,3533,3553,3557,3599,3623,3643,3681,3686,3702],{"__ignoreMap":696},[700,3534,3535,3537,3539,3541,3543,3545,3547,3549,3551],{"class":702,"line":703},[700,3536,783],{"class":782},[700,3538,2886],{"class":782},[700,3540,808],{"class":793},[700,3542,2891],{"class":786},[700,3544,814],{"class":793},[700,3546,817],{"class":782},[700,3548,794],{"class":793},[700,3550,822],{"class":709},[700,3552,800],{"class":793},[700,3554,3555],{"class":702,"line":803},[700,3556,850],{"emptyLinePlaceholder":849},[700,3558,3559,3561,3563,3565,3567,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587,3589,3591,3593,3595,3597],{"class":702,"line":827},[700,3560,935],{"class":786},[700,3562,938],{"class":793},[700,3564,1921],{"class":856},[700,3566,860],{"class":786},[700,3568,888],{"class":793},[700,3570,3445],{"class":709},[700,3572,888],{"class":793},[700,3574,975],{"class":793},[700,3576,921],{"class":786},[700,3578,938],{"class":793},[700,3580,1044],{"class":856},[700,3582,2790],{"class":786},[700,3584,975],{"class":793},[700,3586,978],{"class":793},[700,3588,982],{"class":981},[700,3590,975],{"class":793},[700,3592,987],{"class":981},[700,3594,990],{"class":793},[700,3596,993],{"class":911},[700,3598,996],{"class":793},[700,3600,3601,3603,3606,3608,3610,3612,3615,3618,3620],{"class":702,"line":846},[700,3602,1173],{"class":911},[700,3604,3605],{"class":786}," batch",[700,3607,1179],{"class":793},[700,3609,1182],{"class":786},[700,3611,938],{"class":793},[700,3613,3614],{"class":786},"body",[700,3616,3617],{"class":782}," as",[700,3619,2891],{"class":706},[700,3621,3622],{"class":869},"[]\n",[700,3624,3625,3628,3630,3632,3634,3637,3639,3641],{"class":702,"line":853},[700,3626,3627],{"class":782},"  for",[700,3629,978],{"class":869},[700,3631,912],{"class":911},[700,3633,3157],{"class":786},[700,3635,3636],{"class":793}," of",[700,3638,3605],{"class":786},[700,3640,1396],{"class":869},[700,3642,863],{"class":793},[700,3644,3645,3648,3650,3652,3654,3656,3659,3661,3663,3666,3668,3671,3673,3675,3677,3679],{"class":702,"line":866},[700,3646,3647],{"class":786},"    console",[700,3649,938],{"class":793},[700,3651,1007],{"class":856},[700,3653,860],{"class":869},[700,3655,888],{"class":793},[700,3657,3658],{"class":709},"[BROWSER]",[700,3660,888],{"class":793},[700,3662,975],{"class":793},[700,3664,3665],{"class":786}," JSON",[700,3667,938],{"class":793},[700,3669,3670],{"class":856},"stringify",[700,3672,860],{"class":869},[700,3674,2804],{"class":786},[700,3676,938],{"class":793},[700,3678,2831],{"class":786},[700,3680,2863],{"class":869},[700,3682,3683],{"class":702,"line":894},[700,3684,3685],{"class":793},"  }\n",[700,3687,3688,3690,3692,3695,3697,3700],{"class":702,"line":903},[700,3689,1039],{"class":786},[700,3691,938],{"class":793},[700,3693,3694],{"class":856},"sendStatus",[700,3696,860],{"class":869},[700,3698,3699],{"class":1088},"204",[700,3701,900],{"class":869},[700,3703,3704,3706],{"class":702,"line":908},[700,3705,897],{"class":793},[700,3707,900],{"class":786},[1093,3709,3712,3713,3717],{"color":3710,"icon":3711},"neutral","i-lucide-globe","See the full ",[667,3714,3716],{"href":3715},"\u002Fextend\u002Fdrain-pipeline#http-drain-browser-to-server","HTTP drain"," adapter docs for batching, retry, sendBeacon fallback, and authentication options.",[678,3719,3721],{"id":3720},"run-locally","Run Locally",[690,3723,3726],{"className":692,"code":3724,"filename":3725,"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,3727,3728,3739,3747,3754],{"__ignoreMap":696},[700,3729,3730,3733,3736],{"class":702,"line":703},[700,3731,3732],{"class":706},"git",[700,3734,3735],{"class":709}," clone",[700,3737,3738],{"class":709}," https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog.git\n",[700,3740,3741,3744],{"class":702,"line":803},[700,3742,3743],{"class":856},"cd",[700,3745,3746],{"class":709}," evlog\n",[700,3748,3749,3751],{"class":702,"line":827},[700,3750,694],{"class":706},[700,3752,3753],{"class":709}," install\n",[700,3755,3756,3758,3761],{"class":702,"line":846},[700,3757,694],{"class":706},[700,3759,3760],{"class":709}," example",[700,3762,716],{"class":709},[618,3764,3765,3766,3770],{},"Open ",[667,3767,3768],{"href":3768,"rel":3769},"http:\u002F\u002Flocalhost:3000",[671]," to explore the interactive test UI.",[3772,3773,3774],"card-group",{},[3775,3776,3780],"card",{"icon":3777,"title":3778,"to":3779},"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,3782,3784],{"id":3783},"next-steps","Next Steps",[618,3786,3787,3788,3790],{},"Deepen your ",[1097,3789,280],{}," integration:",[639,3792,3793,3798,3803,3808],{},[642,3794,3795,3797],{},[667,3796,51],{"href":52},": Design comprehensive events with context layering",[642,3799,3800,3802],{},[667,3801,158],{"href":163},": Send logs to Axiom, Sentry, PostHog, and more",[642,3804,3805,3807],{},[667,3806,66],{"href":67},": Control log volume with head and tail sampling",[642,3809,3810,3812,3813,2105,3815,2109,3817,3819],{},[667,3811,56],{"href":57},": Throw errors with ",[622,3814,2104],{},[622,3816,2108],{},[622,3818,2112],{}," fields",[3821,3822,3823],"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":3825},[3826,3830,3831,3832,3834,3835,3838,3841,3842,3843,3847,3848],{"id":680,"depth":803,"text":25,"children":3827},[3828,3829],{"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":3833},"Background work (log.fork)",{"id":2094,"depth":803,"text":2095},{"id":2504,"depth":803,"text":557,"children":3836},[3837],{"id":2517,"depth":827,"text":2518},{"id":2692,"depth":803,"text":2693,"children":3839},[3840],{"id":2866,"depth":827,"text":2867},{"id":3080,"depth":803,"text":3081},{"id":3194,"depth":803,"text":3195},{"id":3351,"depth":803,"text":3352,"children":3844},[3845,3846],{"id":3361,"depth":827,"text":3362},{"id":3519,"depth":827,"text":3520},{"id":3720,"depth":803,"text":3721},{"id":3783,"depth":803,"text":3784},"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",[3852],{"label":3778,"icon":3777,"to":3779,"color":3710,"variant":3853},"subtle",{},{"title":280,"icon":283},{"title":280,"description":3849},"wn5IcV8n5c3hBx-Grw3IK1DMLx44Lz7FO7oErZTpKjo",[3859,3861],{"title":275,"path":276,"stem":277,"description":3860,"icon":278,"children":-1},"`EvlogModule.forRoot()` registers the middleware, the exception filter and `useLogger()` across a NestJS app, with async config where you need it.",{"title":285,"path":286,"stem":287,"description":3862,"icon":288,"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.",1791745085276]