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