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