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