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