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