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