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