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