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