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