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