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