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