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