[{"data":1,"prerenderedAt":3151},["ShallowReactive",2],{"navigation_docs":3,"-extend-custom-framework":602,"-extend-custom-framework-surround":3146},[4,35,85,138,318,479,538,577],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Start","\u002Fstart","1.start",[9,14,19,24,29],{"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",{"title":30,"path":31,"stem":32,"icon":33},"Choose your logger","\u002Fstart\u002Ftypescript-logging-library","1.start\u002F5.typescript-logging-library","i-lucide-file-code",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Learn","\u002Flearn","2.learn",[40,45,50,55,60,65,70,75,80],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":66,"path":67,"stem":68,"icon":69},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":71,"path":72,"stem":73,"icon":74},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":76,"path":77,"stem":78,"icon":79},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":81,"path":82,"stem":83,"icon":84},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":86,"path":87,"stem":88,"children":89,"page":34},"CLI","\u002Fcli","3.cli",[90,93,98,103,108,113,118,123,128,133],{"title":41,"path":91,"stem":92,"icon":49},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":94,"path":95,"stem":96,"icon":97},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":99,"path":100,"stem":101,"icon":102},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":104,"path":105,"stem":106,"icon":107},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":109,"path":110,"stem":111,"icon":112},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":114,"path":115,"stem":116,"icon":117},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":119,"path":120,"stem":121,"icon":122},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":124,"path":125,"stem":126,"icon":127},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":129,"path":130,"stem":131,"icon":132},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":134,"path":135,"stem":136,"icon":137},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":139,"path":140,"stem":141,"children":142,"page":34},"Integrate","\u002Fintegrate","4.integrate",[143,147,230],{"title":41,"path":144,"stem":145,"icon":146},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":148,"path":149,"stem":150,"children":151,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[152,155,185,210],{"title":41,"path":153,"stem":154,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":156,"path":157,"stem":158,"children":159,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[160,165,170,175,180],{"title":161,"path":162,"stem":163,"icon":164},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":166,"path":167,"stem":168,"icon":169},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":171,"path":172,"stem":173,"icon":174},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":176,"path":177,"stem":178,"icon":179},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":181,"path":182,"stem":183,"icon":184},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":186,"path":187,"stem":188,"children":189,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[190,195,200,205],{"title":191,"path":192,"stem":193,"icon":194},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":196,"path":197,"stem":198,"icon":199},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":201,"path":202,"stem":203,"icon":204},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":206,"path":207,"stem":208,"icon":209},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":211,"path":212,"stem":213,"children":214,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[215,220,225],{"title":216,"path":217,"stem":218,"icon":219},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":221,"path":222,"stem":223,"icon":224},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":226,"path":227,"stem":228,"icon":229},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":231,"path":232,"stem":233,"children":234,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[235,239,244,249,254,259,264,269,274,279,284,289,294,299,303,308,313],{"title":41,"path":236,"stem":237,"icon":238},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":240,"path":241,"stem":242,"icon":243},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":245,"path":246,"stem":247,"icon":248},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":250,"path":251,"stem":252,"icon":253},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":255,"path":256,"stem":257,"icon":258},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":260,"path":261,"stem":262,"icon":263},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":265,"path":266,"stem":267,"icon":268},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":270,"path":271,"stem":272,"icon":273},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":275,"path":276,"stem":277,"icon":278},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":280,"path":281,"stem":282,"icon":283},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":285,"path":286,"stem":287,"icon":288},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":290,"path":291,"stem":292,"icon":293},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":295,"path":296,"stem":297,"icon":298},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":300,"path":301,"stem":302,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":304,"path":305,"stem":306,"icon":307},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":309,"path":310,"stem":311,"icon":312},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":314,"path":315,"stem":316,"icon":317},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":319,"path":320,"stem":321,"children":322,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[323,326,331,359,386,418,439,444,449,453],{"title":41,"path":324,"stem":325,"icon":107},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":327,"path":328,"stem":329,"icon":330},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":332,"icon":333,"path":334,"stem":335,"children":336,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[337,340,345,350,355],{"title":41,"path":338,"stem":339,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":341,"path":342,"stem":343,"icon":344},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":346,"path":347,"stem":348,"icon":349},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":351,"path":352,"stem":353,"icon":354},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":356,"path":357,"stem":358,"icon":137},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":360,"icon":361,"path":362,"stem":363,"children":364,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[365,368,373,378,382],{"title":41,"path":366,"stem":367,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":369,"path":370,"stem":371,"icon":372},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":374,"path":375,"stem":376,"icon":377},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":379,"path":380,"stem":381,"icon":330},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":383,"path":384,"stem":385,"icon":112},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":387,"icon":388,"path":389,"stem":390,"children":391,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[392,395,400,405,410,414],{"title":41,"path":393,"stem":394,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":396,"path":397,"stem":398,"icon":399},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":401,"path":402,"stem":403,"icon":404},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":406,"path":407,"stem":408,"icon":409},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":411,"path":412,"stem":413,"icon":388},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":415,"path":416,"stem":417,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":356,"icon":112,"path":419,"stem":420,"children":421,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[422,425,430,435],{"title":41,"path":423,"stem":424,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":426,"path":427,"stem":428,"icon":429},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":431,"path":432,"stem":433,"icon":434},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":436,"path":437,"stem":438,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":440,"path":441,"stem":442,"icon":443},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":445,"path":446,"stem":447,"icon":448},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":450,"path":451,"stem":452,"icon":434},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":454,"icon":455,"path":456,"stem":457,"children":458,"page":34},"Signals","i-lucide-scan-search","\u002Fuse-cases\u002Fsignals","5.use-cases\u002F7.signals",[459,462,467,472,475],{"title":41,"path":460,"stem":461,"icon":44},"\u002Fuse-cases\u002Fsignals\u002Foverview","5.use-cases\u002F7.signals\u002F01.overview",{"title":463,"path":464,"stem":465,"icon":466},"What You Can Ask","\u002Fuse-cases\u002Fsignals\u002Fask","5.use-cases\u002F7.signals\u002F02.ask","i-lucide-message-circle-question",{"title":468,"path":469,"stem":470,"icon":471},"What It Costs","\u002Fuse-cases\u002Fsignals\u002Fcost","5.use-cases\u002F7.signals\u002F03.cost","i-lucide-coins",{"title":436,"path":473,"stem":474,"icon":84},"\u002Fuse-cases\u002Fsignals\u002Freference","5.use-cases\u002F7.signals\u002F04.reference",{"title":415,"path":476,"stem":477,"icon":478},"\u002Fuse-cases\u002Fsignals\u002Frecipes","5.use-cases\u002F7.signals\u002F05.recipes","i-lucide-lightbulb",{"title":480,"path":481,"stem":482,"children":483,"page":34},"Extend","\u002Fextend","6.extend",[484,488,493,498,502,507,511,515,519,523,528,533],{"title":41,"path":485,"stem":486,"icon":487},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":489,"path":490,"stem":491,"icon":492},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":494,"path":495,"stem":496,"icon":497},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":499,"path":500,"stem":501,"icon":492},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":503,"path":504,"stem":505,"icon":506},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":415,"path":508,"stem":509,"icon":510},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":512,"path":513,"stem":514,"icon":487},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":516,"path":517,"stem":518,"icon":443},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":520,"path":521,"stem":522,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":524,"path":525,"stem":526,"icon":527},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":529,"path":530,"stem":531,"icon":532},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":534,"path":535,"stem":536,"icon":537},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":436,"path":539,"stem":540,"children":541,"page":34},"\u002Freference","7.reference",[542,546,551,554,559,563,568,572],{"title":41,"path":543,"stem":544,"icon":545},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":547,"path":548,"stem":549,"icon":550},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":383,"path":552,"stem":553,"icon":112},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":555,"path":556,"stem":557,"icon":558},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":560,"path":561,"stem":562,"icon":388},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":564,"path":565,"stem":566,"icon":567},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":569,"path":570,"stem":571,"icon":443},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":573,"path":574,"stem":575,"icon":576},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"title":578,"path":579,"stem":580,"children":581,"page":34},"Compare","\u002Fcompare","8.compare",[582,586,590,594,598],{"title":583,"path":584,"stem":585,"icon":567},"evlog vs Pino","\u002Fcompare\u002Fpino","8.compare\u002F1.pino",{"title":587,"path":588,"stem":589,"icon":204},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","8.compare\u002F2.opentelemetry",{"title":591,"path":592,"stem":593,"icon":567},"evlog vs LogTape","\u002Fcompare\u002Flogtape","8.compare\u002F3.logtape",{"title":595,"path":596,"stem":597,"icon":567},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","8.compare\u002F4.winston",{"title":599,"path":600,"stem":601,"icon":567},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","8.compare\u002F5.consola",{"id":603,"title":604,"body":605,"description":3136,"extension":3137,"links":3138,"meta":3142,"navigation":3143,"path":495,"seo":3144,"stem":496,"__hash__":3145},"docs\u002F6.extend\u002F10.custom-framework.md","Custom Framework Integration",{"type":606,"value":607,"toc":3123},"minimark",[608,621,629,639,722,885,890,961,965,1181,1204,1208,1217,2042,2048,2056,2059,2119,2122,2126,2138,2248,2262,2266,2278,2287,2404,2419,2661,2671,2675,2682,2932,2939,2943,2946,3070,3081,3085,3119],[609,610,611,612,616,617,620],"p",{},"When the framework you use doesn't have an ",[613,614,615],"code",{},"evlog\u002F\u003Cframework>"," package yet, you build the integration yourself. ",[613,618,619],{},"evlog\u002Ftoolkit"," ships the same building blocks that power every built-in integration (Hono, Express, Fastify, Elysia, NestJS, SvelteKit), so you only write the framework-specific glue.",[609,622,623,624,628],{},"The mental model is always the same: ",[625,626,627],"strong",{},"request lifecycle → logger creation → enrich → drain",". The toolkit handles the request-context plumbing.",[630,631,634,635,638],"callout",{"color":632,"icon":633},"warning","i-lucide-flask-conical","The toolkit API is marked as ",[625,636,637],{},"beta",". The surface is stable (used by all built-in integrations) but may evolve based on community feedback.",[640,641,642,658],"table",{},[643,644,645],"thead",{},[646,647,648,652,655],"tr",{},[649,650,651],"th",{},"Surface",[649,653,654],{},"What it does",[649,656,657],{},"When to use",[659,660,661,683,706],"tbody",{},[646,662,663,673,676],{},[664,665,666],"td",{},[667,668,670],"a",{"href":669},"#manifest-mode-recommended",[613,671,672],{},"defineFrameworkIntegration()",[664,674,675],{},"Declaratively wire request extraction + logger attachment",[664,677,678,679,682],{},"HTTP frameworks with a ",[613,680,681],{},"(ctx, next)"," middleware shape (Hono, Express, Fastify, Elysia, NestJS-shaped)",[646,684,685,693,696],{},[664,686,687],{},[667,688,690],{"href":689},"#custom-mode",[613,691,692],{},"createMiddlewareLogger()",[664,694,695],{},"Imperative path: create the logger at request start, emit on response end",[664,697,698,699,701,702,705],{},"Frameworks whose lifecycle doesn't fit ",[613,700,681],{}," (NestJS interceptors, Next.js App Router, SvelteKit ",[613,703,704],{},"handle",")",[646,707,708,716,719],{},[664,709,710],{},[667,711,713],{"href":712},"#non-http-runtimes",[613,714,715],{},"createRequestLogger()",[664,717,718],{},"Wrap any unit of work in a logger lifecycle",[664,720,721],{},"Non-HTTP runtimes (queue workers, CLI, cron, durable workflows)",[723,724,727,730,877],"prompt",{":actions":725,"description":726,"icon":497},"[\"copy\",\"cursor\",\"claude\"]","Build an evlog integration for a custom framework",[609,728,729],{},"Wire evlog into an HTTP framework (or non-HTTP runtime) that doesn't have a built-in integration.",[731,732,733,767,781,791,805,820,831,857,868],"ul",{},[734,735,736,737,739,740,743,744,746,747,750,751,754,755,758,759,762,763,766],"li",{},"For HTTP frameworks with ",[613,738,681],{},", use ",[613,741,742],{},"defineFrameworkIntegration"," from ",[613,745,619],{},", declare ",[613,748,749],{},"extractRequest(ctx)"," returning ",[613,752,753],{},"{ method, path, headers, requestId? }",", ",[613,756,757],{},"attachLogger(ctx, logger)",", and an optional storage from ",[613,760,761],{},"createLoggerStorage()"," (prefer ",[613,764,765],{},"evlog\u002Ftoolkit\u002Fstorage"," on Workers \u002F edge)",[734,768,769,770,773,774,777,778,780],{},"Headers may be either Web ",[613,771,772],{},"Headers"," or Node ",[613,775,776],{},"IncomingHttpHeaders",". ",[613,779,742],{}," normalizes both",[734,782,783,784,787,788],{},"In your middleware, call ",[613,785,786],{},"integration.start(ctx, options)"," which returns ",[613,789,790],{},"{ skipped, finish, runWith, logger, middlewareOptions }",[734,792,793,794,797,798,801,802],{},"If ",[613,795,796],{},"skipped"," is ",[613,799,800],{},"true",", skip directly to ",[613,803,804],{},"next",[734,806,807,808,811,812,815,816,819],{},"Run downstream handlers inside ",[613,809,810],{},"runWith(() => next())"," so ",[613,813,814],{},"AsyncLocalStorage"," and ",[613,817,818],{},"log.fork()"," work",[734,821,822,823,826,827,830],{},"On success: ",[613,824,825],{},"await finish({ status })","; on error: ",[613,828,829],{},"await finish({ error })"," then re-throw",[734,832,833,834,754,837,754,840,754,843,754,846,754,849,852,853,856],{},"Expose ",[613,835,836],{},"drain",[613,838,839],{},"enrich",[613,841,842],{},"keep",[613,844,845],{},"include",[613,847,848],{},"exclude",[613,850,851],{},"routes",", and ",[613,854,855],{},"plugins"," options",[734,858,859,860,863,864,867],{},"On Cloudflare Workers \u002F Vercel Edge, pass ",[613,861,862],{},"waitUntil"," (or ",[613,865,866],{},"extractWaitUntil"," on the manifest) so async drains complete after the response",[734,869,870,871,743,874,876],{},"For non-HTTP runtimes (queue workers, CLI, cron), use ",[613,872,873],{},"createRequestLogger",[613,875,619],{}," directly. Wrap each unit of work in a logger lifecycle",[609,878,879,880],{},"Docs: ",[667,881,882],{"href":882,"rel":883},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fcustom-framework",[884],"nofollow",[886,887,889],"h2",{"id":888},"install","Install",[891,892,893,918,932,946],"code-group",{},[894,895,901],"pre",{"className":896,"code":897,"filename":898,"language":899,"meta":900,"style":900},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add evlog\n","pnpm","bash","",[613,902,903],{"__ignoreMap":900},[904,905,908,911,915],"span",{"class":906,"line":907},"line",1,[904,909,898],{"class":910},"sBMFI",[904,912,914],{"class":913},"sfazB"," add",[904,916,917],{"class":913}," evlog\n",[894,919,922],{"className":896,"code":920,"filename":921,"language":899,"meta":900,"style":900},"bun add evlog\n","bun",[613,923,924],{"__ignoreMap":900},[904,925,926,928,930],{"class":906,"line":907},[904,927,921],{"class":910},[904,929,914],{"class":913},[904,931,917],{"class":913},[894,933,936],{"className":896,"code":934,"filename":935,"language":899,"meta":900,"style":900},"yarn add evlog\n","yarn",[613,937,938],{"__ignoreMap":900},[904,939,940,942,944],{"class":906,"line":907},[904,941,935],{"class":910},[904,943,914],{"class":913},[904,945,917],{"class":913},[894,947,950],{"className":896,"code":948,"filename":949,"language":899,"meta":900,"style":900},"npm install evlog\n","npm",[613,951,952],{"__ignoreMap":900},[904,953,954,956,959],{"class":906,"line":907},[904,955,949],{"class":910},[904,957,958],{"class":913}," install",[904,960,917],{"class":913},[886,962,964],{"id":963},"whats-in-the-toolkit","What's in the toolkit",[640,966,967,977],{},[643,968,969],{},[646,970,971,974],{},[649,972,973],{},"Export",[649,975,976],{},"Purpose",[659,978,979,989,999,1013,1023,1047,1060,1073,1085,1108,1126,1140,1171],{},[646,980,981,986],{},[664,982,983],{},[613,984,985],{},"defineFrameworkIntegration(spec)",[664,987,988],{},"Manifest factory — extract request, create logger, attach, run with ALS",[646,990,991,996],{},[664,992,993],{},[613,994,995],{},"createMiddlewareLogger(opts)",[664,997,998],{},"Lower-level lifecycle (custom mode)",[646,1000,1001,1006],{},[664,1002,1003,1005],{},[613,1004,862],{}," on middleware options",[664,1007,1008,1009,705],{},"Defer drain on Cloudflare Workers \u002F Vercel Edge (see ",[667,1010,1012],{"href":1011},"#serverless-workers-and-edge","Serverless",[646,1014,1015,1020],{},[664,1016,1017],{},[613,1018,1019],{},"createRequestLogger(opts)",[664,1021,1022],{},"Wrap a non-HTTP unit of work in a logger lifecycle",[646,1024,1025,1030],{},[664,1026,1027],{},[613,1028,1029],{},"BaseEvlogOptions",[664,1031,1032,1033,754,1035,754,1037,754,1039,754,1041,754,1043,754,1045],{},"Base user-facing options — ",[613,1034,836],{},[613,1036,839],{},[613,1038,842],{},[613,1040,845],{},[613,1042,848],{},[613,1044,851],{},[613,1046,855],{},[646,1048,1049,1054],{},[664,1050,1051],{},[613,1052,1053],{},"MiddlewareLoggerResult",[664,1055,1056,1057],{},"Return type: ",[613,1058,1059],{},"{ logger, finish, skipped }",[646,1061,1062,1067],{},[664,1063,1064],{},[613,1065,1066],{},"extractSafeHeaders(headers)",[664,1068,1069,1070,1072],{},"Filter sensitive headers from a Web API ",[613,1071,772],{}," object",[646,1074,1075,1080],{},[664,1076,1077],{},[613,1078,1079],{},"extractSafeNodeHeaders(headers)",[664,1081,1082,1083],{},"Filter sensitive headers from Node.js ",[613,1084,776],{},[646,1086,1087,1092],{},[664,1088,1089],{},[613,1090,1091],{},"createLoggerStorage(hint)",[664,1093,1094,1095,1098,1099,1101,1102,1104,1105,705],{},"Factory returning ",[613,1096,1097],{},"{ storage, useLogger }"," backed by ",[613,1100,814],{}," — also on ",[613,1103,765],{}," (prefer that entry on Workers \u002F edge to isolate ",[613,1106,1107],{},"node:async_hooks",[646,1109,1110,1115],{},[664,1111,1112],{},[613,1113,1114],{},"attachForkToLogger(storage, parent, opts)",[664,1116,1117,1118,1121,1122,1125],{},"Wires ",[613,1119,1120],{},"log.fork(label, fn)"," onto the request logger so consumers can spawn correlated background work — used by manifest mode automatically; call manually in custom mode after ",[613,1123,1124],{},"createMiddlewareLogger"," returns the logger and before the lifecycle finishes",[646,1127,1128,1133],{},[664,1129,1130],{},[613,1131,1132],{},"defineEvlog(config)",[664,1134,1135,1136,1139],{},"Canonical config object — works for ",[613,1137,1138],{},"initLogger"," and middleware options",[646,1141,1142,1147],{},[664,1143,1144],{},[613,1145,1146],{},"definePlugin(plugin)",[664,1148,1149,1150,754,1153,754,1155,754,1157,754,1159,754,1162,754,1165,754,1168],{},"Plugin contract — opt into any subset of ",[613,1151,1152],{},"setup",[613,1154,839],{},[613,1156,836],{},[613,1158,842],{},[613,1160,1161],{},"onRequestStart",[613,1163,1164],{},"onRequestFinish",[613,1166,1167],{},"onClientLog",[613,1169,1170],{},"extendLogger",[646,1172,1173,1178],{},[664,1174,1175],{},[613,1176,1177],{},"composeEnrichers \u002F composeDrains \u002F composeKeep \u002F composePlugins",[664,1179,1180],{},"Combine multiple extensions into one",[609,1182,1183,1184,754,1187,754,1190,754,1193,852,1196,1199,1200,1203],{},"Types like ",[613,1185,1186],{},"RequestLogger",[613,1188,1189],{},"DrainContext",[613,1191,1192],{},"EnrichContext",[613,1194,1195],{},"WideEvent",[613,1197,1198],{},"TailSamplingContext"," are exported from the main ",[613,1201,1202],{},"evlog"," package.",[886,1205,1207],{"id":1206},"manifest-mode-recommended","Manifest mode (recommended)",[609,1209,1210,1211,1213,1214,1216],{},"Most frameworks fit a ",[613,1212,681],{}," middleware shape. For those, write a manifest describing how to extract the request and attach the logger. ",[613,1215,742],{}," does the rest.",[1218,1219,1220],"code-collapse",{},[894,1221,1226],{"className":1222,"code":1223,"filename":1224,"language":1225,"meta":900,"style":900},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport {\n  createLoggerStorage,\n  defineFrameworkIntegration,\n  type BaseEvlogOptions,\n} from 'evlog\u002Ftoolkit'\n\u002F\u002F On Workers \u002F edge, prefer: import { createLoggerStorage } from 'evlog\u002Ftoolkit\u002Fstorage'\nimport type { RequestLogger } from 'evlog'\n\nexport type MyFrameworkEvlogOptions = BaseEvlogOptions\n\nconst { storage, useLogger } = createLoggerStorage(\n  'Cannot access logger outside of middleware context. Make sure evlog middleware is registered before your routes.',\n)\n\nexport { useLogger }\n\nconst integration = defineFrameworkIntegration\u003CIncomingMessage>({\n  name: 'my-framework',\n  extractRequest: (req) => ({\n    method: req.method || 'GET',\n    path: req.url || '\u002F',\n    headers: req.headers,\n    requestId: typeof req.headers['x-request-id'] === 'string'\n      ? req.headers['x-request-id']\n      : undefined,\n  }),\n  attachLogger: (req, logger) => {\n    (req as IncomingMessage & { log: RequestLogger }).log = logger\n  },\n  storage,\n})\n\nexport function evlog(options: MyFrameworkEvlogOptions = {}) {\n  return async (req: IncomingMessage, res: ServerResponse, next: () => Promise\u003Cvoid>) => {\n    const { skipped, finish, runWith } = integration.start(req, options)\n    if (skipped) {\n      await next()\n      return\n    }\n    try {\n      await runWith(() => next())\n      await finish({ status: res.statusCode })\n    } catch (error) {\n      await finish({ error: error as Error })\n      throw error\n    }\n  }\n}\n","my-framework-evlog.ts","typescript",[613,1227,1228,1266,1274,1283,1291,1302,1316,1323,1345,1352,1370,1375,1402,1416,1422,1427,1440,1445,1474,1493,1517,1546,1572,1589,1627,1648,1657,1667,1690,1729,1735,1743,1750,1755,1782,1835,1878,1893,1904,1910,1916,1924,1943,1971,1989,2016,2025,2030,2036],{"__ignoreMap":900},[904,1229,1230,1234,1237,1241,1245,1248,1251,1254,1257,1260,1263],{"class":906,"line":907},[904,1231,1233],{"class":1232},"s7zQu","import",[904,1235,1236],{"class":1232}," type",[904,1238,1240],{"class":1239},"sMK4o"," {",[904,1242,1244],{"class":1243},"sTEyZ"," IncomingMessage",[904,1246,1247],{"class":1239},",",[904,1249,1250],{"class":1243}," ServerResponse",[904,1252,1253],{"class":1239}," }",[904,1255,1256],{"class":1232}," from",[904,1258,1259],{"class":1239}," '",[904,1261,1262],{"class":913},"node:http",[904,1264,1265],{"class":1239},"'\n",[904,1267,1269,1271],{"class":906,"line":1268},2,[904,1270,1233],{"class":1232},[904,1272,1273],{"class":1239}," {\n",[904,1275,1277,1280],{"class":906,"line":1276},3,[904,1278,1279],{"class":1243},"  createLoggerStorage",[904,1281,1282],{"class":1239},",\n",[904,1284,1286,1289],{"class":906,"line":1285},4,[904,1287,1288],{"class":1243},"  defineFrameworkIntegration",[904,1290,1282],{"class":1239},[904,1292,1294,1297,1300],{"class":906,"line":1293},5,[904,1295,1296],{"class":1232},"  type",[904,1298,1299],{"class":1243}," BaseEvlogOptions",[904,1301,1282],{"class":1239},[904,1303,1305,1308,1310,1312,1314],{"class":906,"line":1304},6,[904,1306,1307],{"class":1239},"}",[904,1309,1256],{"class":1232},[904,1311,1259],{"class":1239},[904,1313,619],{"class":913},[904,1315,1265],{"class":1239},[904,1317,1319],{"class":906,"line":1318},7,[904,1320,1322],{"class":1321},"sHwdD","\u002F\u002F On Workers \u002F edge, prefer: import { createLoggerStorage } from 'evlog\u002Ftoolkit\u002Fstorage'\n",[904,1324,1326,1328,1330,1332,1335,1337,1339,1341,1343],{"class":906,"line":1325},8,[904,1327,1233],{"class":1232},[904,1329,1236],{"class":1232},[904,1331,1240],{"class":1239},[904,1333,1334],{"class":1243}," RequestLogger",[904,1336,1253],{"class":1239},[904,1338,1256],{"class":1232},[904,1340,1259],{"class":1239},[904,1342,1202],{"class":913},[904,1344,1265],{"class":1239},[904,1346,1348],{"class":906,"line":1347},9,[904,1349,1351],{"emptyLinePlaceholder":1350},true,"\n",[904,1353,1355,1358,1361,1364,1367],{"class":906,"line":1354},10,[904,1356,1357],{"class":1232},"export",[904,1359,1236],{"class":1360},"spNyl",[904,1362,1363],{"class":910}," MyFrameworkEvlogOptions",[904,1365,1366],{"class":1239}," =",[904,1368,1369],{"class":910}," BaseEvlogOptions\n",[904,1371,1373],{"class":906,"line":1372},11,[904,1374,1351],{"emptyLinePlaceholder":1350},[904,1376,1378,1381,1383,1386,1388,1391,1393,1395,1399],{"class":906,"line":1377},12,[904,1379,1380],{"class":1360},"const",[904,1382,1240],{"class":1239},[904,1384,1385],{"class":1243}," storage",[904,1387,1247],{"class":1239},[904,1389,1390],{"class":1243}," useLogger ",[904,1392,1307],{"class":1239},[904,1394,1366],{"class":1239},[904,1396,1398],{"class":1397},"s2Zo4"," createLoggerStorage",[904,1400,1401],{"class":1243},"(\n",[904,1403,1405,1408,1411,1414],{"class":906,"line":1404},13,[904,1406,1407],{"class":1239},"  '",[904,1409,1410],{"class":913},"Cannot access logger outside of middleware context. Make sure evlog middleware is registered before your routes.",[904,1412,1413],{"class":1239},"'",[904,1415,1282],{"class":1239},[904,1417,1419],{"class":906,"line":1418},14,[904,1420,1421],{"class":1243},")\n",[904,1423,1425],{"class":906,"line":1424},15,[904,1426,1351],{"emptyLinePlaceholder":1350},[904,1428,1430,1432,1434,1437],{"class":906,"line":1429},16,[904,1431,1357],{"class":1232},[904,1433,1240],{"class":1239},[904,1435,1436],{"class":1243}," useLogger",[904,1438,1439],{"class":1239}," }\n",[904,1441,1443],{"class":906,"line":1442},17,[904,1444,1351],{"emptyLinePlaceholder":1350},[904,1446,1448,1450,1453,1456,1459,1462,1465,1468,1471],{"class":906,"line":1447},18,[904,1449,1380],{"class":1360},[904,1451,1452],{"class":1243}," integration ",[904,1454,1455],{"class":1239},"=",[904,1457,1458],{"class":1397}," defineFrameworkIntegration",[904,1460,1461],{"class":1239},"\u003C",[904,1463,1464],{"class":910},"IncomingMessage",[904,1466,1467],{"class":1239},">",[904,1469,1470],{"class":1243},"(",[904,1472,1473],{"class":1239},"{\n",[904,1475,1477,1481,1484,1486,1489,1491],{"class":906,"line":1476},19,[904,1478,1480],{"class":1479},"swJcz","  name",[904,1482,1483],{"class":1239},":",[904,1485,1259],{"class":1239},[904,1487,1488],{"class":913},"my-framework",[904,1490,1413],{"class":1239},[904,1492,1282],{"class":1239},[904,1494,1496,1499,1501,1504,1508,1510,1513,1515],{"class":906,"line":1495},20,[904,1497,1498],{"class":1397},"  extractRequest",[904,1500,1483],{"class":1239},[904,1502,1503],{"class":1239}," (",[904,1505,1507],{"class":1506},"sHdIc","req",[904,1509,705],{"class":1239},[904,1511,1512],{"class":1360}," =>",[904,1514,1503],{"class":1243},[904,1516,1473],{"class":1239},[904,1518,1520,1523,1525,1528,1531,1534,1537,1539,1542,1544],{"class":906,"line":1519},21,[904,1521,1522],{"class":1479},"    method",[904,1524,1483],{"class":1239},[904,1526,1527],{"class":1243}," req",[904,1529,1530],{"class":1239},".",[904,1532,1533],{"class":1243},"method ",[904,1535,1536],{"class":1239},"||",[904,1538,1259],{"class":1239},[904,1540,1541],{"class":913},"GET",[904,1543,1413],{"class":1239},[904,1545,1282],{"class":1239},[904,1547,1549,1552,1554,1556,1558,1561,1563,1565,1568,1570],{"class":906,"line":1548},22,[904,1550,1551],{"class":1479},"    path",[904,1553,1483],{"class":1239},[904,1555,1527],{"class":1243},[904,1557,1530],{"class":1239},[904,1559,1560],{"class":1243},"url ",[904,1562,1536],{"class":1239},[904,1564,1259],{"class":1239},[904,1566,1567],{"class":913},"\u002F",[904,1569,1413],{"class":1239},[904,1571,1282],{"class":1239},[904,1573,1575,1578,1580,1582,1584,1587],{"class":906,"line":1574},23,[904,1576,1577],{"class":1479},"    headers",[904,1579,1483],{"class":1239},[904,1581,1527],{"class":1243},[904,1583,1530],{"class":1239},[904,1585,1586],{"class":1243},"headers",[904,1588,1282],{"class":1239},[904,1590,1592,1595,1597,1600,1602,1604,1607,1609,1612,1614,1617,1620,1622,1625],{"class":906,"line":1591},24,[904,1593,1594],{"class":1479},"    requestId",[904,1596,1483],{"class":1239},[904,1598,1599],{"class":1239}," typeof",[904,1601,1527],{"class":1243},[904,1603,1530],{"class":1239},[904,1605,1606],{"class":1243},"headers[",[904,1608,1413],{"class":1239},[904,1610,1611],{"class":913},"x-request-id",[904,1613,1413],{"class":1239},[904,1615,1616],{"class":1243},"] ",[904,1618,1619],{"class":1239},"===",[904,1621,1259],{"class":1239},[904,1623,1624],{"class":913},"string",[904,1626,1265],{"class":1239},[904,1628,1630,1633,1635,1637,1639,1641,1643,1645],{"class":906,"line":1629},25,[904,1631,1632],{"class":1239},"      ?",[904,1634,1527],{"class":1243},[904,1636,1530],{"class":1239},[904,1638,1606],{"class":1243},[904,1640,1413],{"class":1239},[904,1642,1611],{"class":913},[904,1644,1413],{"class":1239},[904,1646,1647],{"class":1243},"]\n",[904,1649,1651,1654],{"class":906,"line":1650},26,[904,1652,1653],{"class":1239},"      :",[904,1655,1656],{"class":1239}," undefined,\n",[904,1658,1660,1663,1665],{"class":906,"line":1659},27,[904,1661,1662],{"class":1239},"  }",[904,1664,705],{"class":1243},[904,1666,1282],{"class":1239},[904,1668,1670,1673,1675,1677,1679,1681,1684,1686,1688],{"class":906,"line":1669},28,[904,1671,1672],{"class":1397},"  attachLogger",[904,1674,1483],{"class":1239},[904,1676,1503],{"class":1239},[904,1678,1507],{"class":1506},[904,1680,1247],{"class":1239},[904,1682,1683],{"class":1506}," logger",[904,1685,705],{"class":1239},[904,1687,1512],{"class":1360},[904,1689,1273],{"class":1239},[904,1691,1693,1696,1698,1701,1703,1706,1708,1711,1713,1715,1717,1719,1721,1724,1726],{"class":906,"line":1692},29,[904,1694,1695],{"class":1479},"    (",[904,1697,1507],{"class":1243},[904,1699,1700],{"class":1232}," as",[904,1702,1244],{"class":910},[904,1704,1705],{"class":1239}," &",[904,1707,1240],{"class":1239},[904,1709,1710],{"class":1479}," log",[904,1712,1483],{"class":1239},[904,1714,1334],{"class":910},[904,1716,1253],{"class":1239},[904,1718,705],{"class":1479},[904,1720,1530],{"class":1239},[904,1722,1723],{"class":1243},"log",[904,1725,1366],{"class":1239},[904,1727,1728],{"class":1243}," logger\n",[904,1730,1732],{"class":906,"line":1731},30,[904,1733,1734],{"class":1239},"  },\n",[904,1736,1738,1741],{"class":906,"line":1737},31,[904,1739,1740],{"class":1243},"  storage",[904,1742,1282],{"class":1239},[904,1744,1746,1748],{"class":906,"line":1745},32,[904,1747,1307],{"class":1239},[904,1749,1421],{"class":1243},[904,1751,1753],{"class":906,"line":1752},33,[904,1754,1351],{"emptyLinePlaceholder":1350},[904,1756,1758,1760,1763,1766,1768,1771,1773,1775,1777,1780],{"class":906,"line":1757},34,[904,1759,1357],{"class":1232},[904,1761,1762],{"class":1360}," function",[904,1764,1765],{"class":1397}," evlog",[904,1767,1470],{"class":1239},[904,1769,1770],{"class":1506},"options",[904,1772,1483],{"class":1239},[904,1774,1363],{"class":910},[904,1776,1366],{"class":1239},[904,1778,1779],{"class":1239}," {})",[904,1781,1273],{"class":1239},[904,1783,1785,1788,1791,1793,1795,1797,1799,1801,1804,1806,1808,1810,1813,1815,1818,1820,1823,1825,1828,1831,1833],{"class":906,"line":1784},35,[904,1786,1787],{"class":1232},"  return",[904,1789,1790],{"class":1360}," async",[904,1792,1503],{"class":1239},[904,1794,1507],{"class":1506},[904,1796,1483],{"class":1239},[904,1798,1244],{"class":910},[904,1800,1247],{"class":1239},[904,1802,1803],{"class":1506}," res",[904,1805,1483],{"class":1239},[904,1807,1250],{"class":910},[904,1809,1247],{"class":1239},[904,1811,1812],{"class":1397}," next",[904,1814,1483],{"class":1239},[904,1816,1817],{"class":1239}," ()",[904,1819,1512],{"class":1360},[904,1821,1822],{"class":910}," Promise",[904,1824,1461],{"class":1239},[904,1826,1827],{"class":910},"void",[904,1829,1830],{"class":1239},">)",[904,1832,1512],{"class":1360},[904,1834,1273],{"class":1239},[904,1836,1838,1841,1843,1846,1848,1851,1853,1856,1858,1860,1863,1865,1868,1870,1872,1874,1876],{"class":906,"line":1837},36,[904,1839,1840],{"class":1360},"    const",[904,1842,1240],{"class":1239},[904,1844,1845],{"class":1243}," skipped",[904,1847,1247],{"class":1239},[904,1849,1850],{"class":1243}," finish",[904,1852,1247],{"class":1239},[904,1854,1855],{"class":1243}," runWith",[904,1857,1253],{"class":1239},[904,1859,1366],{"class":1239},[904,1861,1862],{"class":1243}," integration",[904,1864,1530],{"class":1239},[904,1866,1867],{"class":1397},"start",[904,1869,1470],{"class":1479},[904,1871,1507],{"class":1243},[904,1873,1247],{"class":1239},[904,1875,856],{"class":1243},[904,1877,1421],{"class":1479},[904,1879,1881,1884,1886,1888,1891],{"class":906,"line":1880},37,[904,1882,1883],{"class":1232},"    if",[904,1885,1503],{"class":1479},[904,1887,796],{"class":1243},[904,1889,1890],{"class":1479},") ",[904,1892,1473],{"class":1239},[904,1894,1896,1899,1901],{"class":906,"line":1895},38,[904,1897,1898],{"class":1232},"      await",[904,1900,1812],{"class":1397},[904,1902,1903],{"class":1479},"()\n",[904,1905,1907],{"class":906,"line":1906},39,[904,1908,1909],{"class":1232},"      return\n",[904,1911,1913],{"class":906,"line":1912},40,[904,1914,1915],{"class":1239},"    }\n",[904,1917,1919,1922],{"class":906,"line":1918},41,[904,1920,1921],{"class":1232},"    try",[904,1923,1273],{"class":1239},[904,1925,1927,1929,1931,1933,1936,1938,1940],{"class":906,"line":1926},42,[904,1928,1898],{"class":1232},[904,1930,1855],{"class":1397},[904,1932,1470],{"class":1479},[904,1934,1935],{"class":1239},"()",[904,1937,1512],{"class":1360},[904,1939,1812],{"class":1397},[904,1941,1942],{"class":1479},"())\n",[904,1944,1946,1948,1950,1952,1955,1958,1960,1962,1964,1967,1969],{"class":906,"line":1945},43,[904,1947,1898],{"class":1232},[904,1949,1850],{"class":1397},[904,1951,1470],{"class":1479},[904,1953,1954],{"class":1239},"{",[904,1956,1957],{"class":1479}," status",[904,1959,1483],{"class":1239},[904,1961,1803],{"class":1243},[904,1963,1530],{"class":1239},[904,1965,1966],{"class":1243},"statusCode",[904,1968,1253],{"class":1239},[904,1970,1421],{"class":1479},[904,1972,1974,1977,1980,1982,1985,1987],{"class":906,"line":1973},44,[904,1975,1976],{"class":1239},"    }",[904,1978,1979],{"class":1232}," catch",[904,1981,1503],{"class":1479},[904,1983,1984],{"class":1243},"error",[904,1986,1890],{"class":1479},[904,1988,1473],{"class":1239},[904,1990,1992,1994,1996,1998,2000,2003,2005,2007,2009,2012,2014],{"class":906,"line":1991},45,[904,1993,1898],{"class":1232},[904,1995,1850],{"class":1397},[904,1997,1470],{"class":1479},[904,1999,1954],{"class":1239},[904,2001,2002],{"class":1479}," error",[904,2004,1483],{"class":1239},[904,2006,2002],{"class":1243},[904,2008,1700],{"class":1232},[904,2010,2011],{"class":910}," Error",[904,2013,1253],{"class":1239},[904,2015,1421],{"class":1479},[904,2017,2019,2022],{"class":906,"line":2018},46,[904,2020,2021],{"class":1232},"      throw",[904,2023,2024],{"class":1243}," error\n",[904,2026,2028],{"class":906,"line":2027},47,[904,2029,1915],{"class":1239},[904,2031,2033],{"class":906,"line":2032},48,[904,2034,2035],{"class":1239},"  }\n",[904,2037,2039],{"class":906,"line":2038},49,[904,2040,2041],{"class":1239},"}\n",[609,2043,2044,2045,2047],{},"That's it. This middleware gets every feature for free: route filtering, drain adapters, enrichers, tail sampling, error capture, plugin lifecycle hooks, ",[613,2046,818],{},", and duration tracking.",[2049,2050,2052,2053,2055],"h3",{"id":2051},"what-defineframeworkintegration-does","What ",[613,2054,742],{}," does",[609,2057,2058],{},"Given the manifest above, the helper:",[2060,2061,2062,2071,2082,2088,2092,2102],"ol",{},[734,2063,2064,2065,2067,2068,2070],{},"Normalizes headers (auto-detects ",[613,2066,772],{}," vs ",[613,2069,776],{},").",[734,2072,2073,2074,2077,2078,2081],{},"Generates a ",[613,2075,2076],{},"requestId"," if ",[613,2079,2080],{},"extractRequest"," doesn't return one.",[734,2083,2084,2085,2087],{},"Calls ",[613,2086,1124],{}," with the merged options.",[734,2089,2084,2090,1530],{},[613,2091,757],{},[734,2093,2094,2095,2097,2098,2101],{},"Attaches ",[613,2096,818],{}," to the logger when ",[613,2099,2100],{},"storage"," is provided (so users can spawn correlated background work).",[734,2103,2104,2105,2108,2109,2112,2113,2116,2117,1530],{},"Exposes ",[613,2106,2107],{},"runWith(fn)",", which runs ",[613,2110,2111],{},"fn()"," inside ",[613,2114,2115],{},"storage.run(logger, …)"," if storage is configured, otherwise just calls ",[613,2118,2111],{},[609,2120,2121],{},"You're left with only the framework-specific glue: where to read the request from, where to attach the logger, and how to compute the response status.",[886,2123,2125],{"id":2124},"custom-mode","Custom mode",[609,2127,2128,2129,2131,2132,2134,2135,2137],{},"If your framework's lifecycle doesn't fit a clean ",[613,2130,681],{}," shape (NestJS interceptors, Next.js App Router, SvelteKit ",[613,2133,704],{},"), drop one level lower and call ",[613,2136,1124],{}," directly:",[894,2139,2141],{"className":1222,"code":2140,"language":1225,"meta":900,"style":900},"import { createMiddlewareLogger, extractSafeNodeHeaders } from 'evlog\u002Ftoolkit'\n\nconst { logger, finish, skipped } = createMiddlewareLogger({\n  method,\n  path,\n  requestId,\n  headers: extractSafeNodeHeaders(rawHeaders),\n  ...options,\n})\n",[613,2142,2143,2167,2171,2198,2205,2212,2219,2233,2242],{"__ignoreMap":900},[904,2144,2145,2147,2149,2152,2154,2157,2159,2161,2163,2165],{"class":906,"line":907},[904,2146,1233],{"class":1232},[904,2148,1240],{"class":1239},[904,2150,2151],{"class":1243}," createMiddlewareLogger",[904,2153,1247],{"class":1239},[904,2155,2156],{"class":1243}," extractSafeNodeHeaders",[904,2158,1253],{"class":1239},[904,2160,1256],{"class":1232},[904,2162,1259],{"class":1239},[904,2164,619],{"class":913},[904,2166,1265],{"class":1239},[904,2168,2169],{"class":906,"line":1268},[904,2170,1351],{"emptyLinePlaceholder":1350},[904,2172,2173,2175,2177,2179,2181,2183,2185,2188,2190,2192,2194,2196],{"class":906,"line":1276},[904,2174,1380],{"class":1360},[904,2176,1240],{"class":1239},[904,2178,1683],{"class":1243},[904,2180,1247],{"class":1239},[904,2182,1850],{"class":1243},[904,2184,1247],{"class":1239},[904,2186,2187],{"class":1243}," skipped ",[904,2189,1307],{"class":1239},[904,2191,1366],{"class":1239},[904,2193,2151],{"class":1397},[904,2195,1470],{"class":1243},[904,2197,1473],{"class":1239},[904,2199,2200,2203],{"class":906,"line":1285},[904,2201,2202],{"class":1243},"  method",[904,2204,1282],{"class":1239},[904,2206,2207,2210],{"class":906,"line":1293},[904,2208,2209],{"class":1243},"  path",[904,2211,1282],{"class":1239},[904,2213,2214,2217],{"class":906,"line":1304},[904,2215,2216],{"class":1243},"  requestId",[904,2218,1282],{"class":1239},[904,2220,2221,2224,2226,2228,2231],{"class":906,"line":1318},[904,2222,2223],{"class":1479},"  headers",[904,2225,1483],{"class":1239},[904,2227,2156],{"class":1397},[904,2229,2230],{"class":1243},"(rawHeaders)",[904,2232,1282],{"class":1239},[904,2234,2235,2238,2240],{"class":906,"line":1325},[904,2236,2237],{"class":1239},"  ...",[904,2239,1770],{"class":1243},[904,2241,1282],{"class":1239},[904,2243,2244,2246],{"class":906,"line":1347},[904,2245,1307],{"class":1239},[904,2247,1421],{"class":1243},[609,2249,2250,2251,2254,2255,2257,2258,2261],{},"You'll be responsible for ALS wrapping (",[613,2252,2253],{},"storage.run","), ",[613,2256,818],{}," attachment (via ",[613,2259,2260],{},"attachForkToLogger","), and finishing the lifecycle, but you keep the full pipeline (route filtering, sampling, emit, enrich, drain, plugins) for free.",[886,2263,2265],{"id":2264},"serverless-workers-and-edge","Serverless: Workers and Edge",[609,2267,2268,2269,2271,2272,2277],{},"On Cloudflare Workers and Vercel Edge, the runtime can terminate as soon as the response is returned. If your drain sends HTTP to an observability backend, pass ",[613,2270,862],{}," so enrich still runs inline but drain work survives after the response, the same behavior as ",[667,2273,2274],{"href":296},[613,2275,2276],{},"evlog\u002Fworkers"," and the Nitro plugin.",[609,2279,2280,2283,2284,2286],{},[625,2281,2282],{},"Custom mode."," Pass ",[613,2285,862],{}," per request:",[894,2288,2290],{"className":1222,"code":2289,"language":1225,"meta":900,"style":900},"import { waitUntil } from '@vercel\u002Ffunctions'\n\u002F\u002F import { waitUntil } from 'cloudflare:workers' \u002F\u002F Vercel-style global on some runtimes\n\nconst { logger, finish, skipped } = createMiddlewareLogger({\n  method,\n  path,\n  requestId,\n  headers: extractSafeNodeHeaders(rawHeaders),\n  waitUntil, \u002F\u002F or ctx.waitUntil.bind(ctx) on Cloudflare\n  ...options,\n})\n",[613,2291,2292,2312,2320,2324,2350,2356,2362,2368,2380,2390,2398],{"__ignoreMap":900},[904,2293,2294,2296,2298,2301,2303,2305,2307,2310],{"class":906,"line":907},[904,2295,1233],{"class":1232},[904,2297,1240],{"class":1239},[904,2299,2300],{"class":1243}," waitUntil",[904,2302,1253],{"class":1239},[904,2304,1256],{"class":1232},[904,2306,1259],{"class":1239},[904,2308,2309],{"class":913},"@vercel\u002Ffunctions",[904,2311,1265],{"class":1239},[904,2313,2314,2317],{"class":906,"line":1268},[904,2315,2316],{"class":1321},"\u002F\u002F import { waitUntil } from 'cloudflare:workers'",[904,2318,2319],{"class":1321}," \u002F\u002F Vercel-style global on some runtimes\n",[904,2321,2322],{"class":906,"line":1276},[904,2323,1351],{"emptyLinePlaceholder":1350},[904,2325,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348],{"class":906,"line":1285},[904,2327,1380],{"class":1360},[904,2329,1240],{"class":1239},[904,2331,1683],{"class":1243},[904,2333,1247],{"class":1239},[904,2335,1850],{"class":1243},[904,2337,1247],{"class":1239},[904,2339,2187],{"class":1243},[904,2341,1307],{"class":1239},[904,2343,1366],{"class":1239},[904,2345,2151],{"class":1397},[904,2347,1470],{"class":1243},[904,2349,1473],{"class":1239},[904,2351,2352,2354],{"class":906,"line":1293},[904,2353,2202],{"class":1243},[904,2355,1282],{"class":1239},[904,2357,2358,2360],{"class":906,"line":1304},[904,2359,2209],{"class":1243},[904,2361,1282],{"class":1239},[904,2363,2364,2366],{"class":906,"line":1318},[904,2365,2216],{"class":1243},[904,2367,1282],{"class":1239},[904,2369,2370,2372,2374,2376,2378],{"class":906,"line":1325},[904,2371,2223],{"class":1479},[904,2373,1483],{"class":1239},[904,2375,2156],{"class":1397},[904,2377,2230],{"class":1243},[904,2379,1282],{"class":1239},[904,2381,2382,2385,2387],{"class":906,"line":1347},[904,2383,2384],{"class":1243},"  waitUntil",[904,2386,1247],{"class":1239},[904,2388,2389],{"class":1321}," \u002F\u002F or ctx.waitUntil.bind(ctx) on Cloudflare\n",[904,2391,2392,2394,2396],{"class":906,"line":1354},[904,2393,2237],{"class":1239},[904,2395,1770],{"class":1243},[904,2397,1282],{"class":1239},[904,2399,2400,2402],{"class":906,"line":1372},[904,2401,1307],{"class":1239},[904,2403,1421],{"class":1243},[609,2405,2406,2409,2410,2412,2413,2415,2416,2418],{},[625,2407,2408],{},"Manifest mode."," Either pass ",[613,2411,862],{}," in ",[613,2414,786],{}," or declare ",[613,2417,866],{}," on the manifest when the hook lives on the framework context:",[894,2420,2422],{"className":1222,"code":2421,"language":1225,"meta":900,"style":900},"const integration = defineFrameworkIntegration\u003CWorkerContext>({\n  name: 'my-framework',\n  extractRequest: (ctx) => ({ \u002F* … *\u002F }),\n  attachLogger: (ctx, logger) => { \u002F* … *\u002F },\n  extractWaitUntil: ctx => ctx.executionCtx.waitUntil.bind(ctx.executionCtx),\n})\n\nexport function evlog(options: BaseEvlogOptions = {}) {\n  return async (ctx, next) => {\n    const { skipped, finish, runWith } = integration.start(ctx, options)\n    \u002F\u002F Per-request override still works:\n    \u002F\u002F integration.start(ctx, { ...options, waitUntil: ctx.executionCtx.waitUntil.bind(ctx.executionCtx) })\n    \u002F\u002F …\n  }\n}\n",[613,2423,2424,2445,2459,2487,2512,2550,2556,2560,2582,2602,2638,2643,2648,2653,2657],{"__ignoreMap":900},[904,2425,2426,2428,2430,2432,2434,2436,2439,2441,2443],{"class":906,"line":907},[904,2427,1380],{"class":1360},[904,2429,1452],{"class":1243},[904,2431,1455],{"class":1239},[904,2433,1458],{"class":1397},[904,2435,1461],{"class":1239},[904,2437,2438],{"class":910},"WorkerContext",[904,2440,1467],{"class":1239},[904,2442,1470],{"class":1243},[904,2444,1473],{"class":1239},[904,2446,2447,2449,2451,2453,2455,2457],{"class":906,"line":1268},[904,2448,1480],{"class":1479},[904,2450,1483],{"class":1239},[904,2452,1259],{"class":1239},[904,2454,1488],{"class":913},[904,2456,1413],{"class":1239},[904,2458,1282],{"class":1239},[904,2460,2461,2463,2465,2467,2470,2472,2474,2476,2478,2481,2483,2485],{"class":906,"line":1276},[904,2462,1498],{"class":1397},[904,2464,1483],{"class":1239},[904,2466,1503],{"class":1239},[904,2468,2469],{"class":1506},"ctx",[904,2471,705],{"class":1239},[904,2473,1512],{"class":1360},[904,2475,1503],{"class":1243},[904,2477,1954],{"class":1239},[904,2479,2480],{"class":1321}," \u002F* … *\u002F",[904,2482,1253],{"class":1239},[904,2484,705],{"class":1243},[904,2486,1282],{"class":1239},[904,2488,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2509],{"class":906,"line":1285},[904,2490,1672],{"class":1397},[904,2492,1483],{"class":1239},[904,2494,1503],{"class":1239},[904,2496,2469],{"class":1506},[904,2498,1247],{"class":1239},[904,2500,1683],{"class":1506},[904,2502,705],{"class":1239},[904,2504,1512],{"class":1360},[904,2506,1240],{"class":1239},[904,2508,2480],{"class":1321},[904,2510,2511],{"class":1239}," },\n",[904,2513,2514,2517,2519,2522,2524,2526,2528,2531,2533,2535,2537,2540,2543,2545,2548],{"class":906,"line":1293},[904,2515,2516],{"class":1397},"  extractWaitUntil",[904,2518,1483],{"class":1239},[904,2520,2521],{"class":1506}," ctx",[904,2523,1512],{"class":1360},[904,2525,2521],{"class":1243},[904,2527,1530],{"class":1239},[904,2529,2530],{"class":1243},"executionCtx",[904,2532,1530],{"class":1239},[904,2534,862],{"class":1243},[904,2536,1530],{"class":1239},[904,2538,2539],{"class":1397},"bind",[904,2541,2542],{"class":1243},"(ctx",[904,2544,1530],{"class":1239},[904,2546,2547],{"class":1243},"executionCtx)",[904,2549,1282],{"class":1239},[904,2551,2552,2554],{"class":906,"line":1304},[904,2553,1307],{"class":1239},[904,2555,1421],{"class":1243},[904,2557,2558],{"class":906,"line":1318},[904,2559,1351],{"emptyLinePlaceholder":1350},[904,2561,2562,2564,2566,2568,2570,2572,2574,2576,2578,2580],{"class":906,"line":1325},[904,2563,1357],{"class":1232},[904,2565,1762],{"class":1360},[904,2567,1765],{"class":1397},[904,2569,1470],{"class":1239},[904,2571,1770],{"class":1506},[904,2573,1483],{"class":1239},[904,2575,1299],{"class":910},[904,2577,1366],{"class":1239},[904,2579,1779],{"class":1239},[904,2581,1273],{"class":1239},[904,2583,2584,2586,2588,2590,2592,2594,2596,2598,2600],{"class":906,"line":1347},[904,2585,1787],{"class":1232},[904,2587,1790],{"class":1360},[904,2589,1503],{"class":1239},[904,2591,2469],{"class":1506},[904,2593,1247],{"class":1239},[904,2595,1812],{"class":1506},[904,2597,705],{"class":1239},[904,2599,1512],{"class":1360},[904,2601,1273],{"class":1239},[904,2603,2604,2606,2608,2610,2612,2614,2616,2618,2620,2622,2624,2626,2628,2630,2632,2634,2636],{"class":906,"line":1354},[904,2605,1840],{"class":1360},[904,2607,1240],{"class":1239},[904,2609,1845],{"class":1243},[904,2611,1247],{"class":1239},[904,2613,1850],{"class":1243},[904,2615,1247],{"class":1239},[904,2617,1855],{"class":1243},[904,2619,1253],{"class":1239},[904,2621,1366],{"class":1239},[904,2623,1862],{"class":1243},[904,2625,1530],{"class":1239},[904,2627,1867],{"class":1397},[904,2629,1470],{"class":1479},[904,2631,2469],{"class":1243},[904,2633,1247],{"class":1239},[904,2635,856],{"class":1243},[904,2637,1421],{"class":1479},[904,2639,2640],{"class":906,"line":1372},[904,2641,2642],{"class":1321},"    \u002F\u002F Per-request override still works:\n",[904,2644,2645],{"class":906,"line":1377},[904,2646,2647],{"class":1321},"    \u002F\u002F integration.start(ctx, { ...options, waitUntil: ctx.executionCtx.waitUntil.bind(ctx.executionCtx) })\n",[904,2649,2650],{"class":906,"line":1404},[904,2651,2652],{"class":1321},"    \u002F\u002F …\n",[904,2654,2655],{"class":906,"line":1418},[904,2656,2035],{"class":1239},[904,2658,2659],{"class":906,"line":1424},[904,2660,2041],{"class":1239},[609,2662,2663,2664,2667,2668,2670],{},"Per-request ",[613,2665,2666],{},"options.waitUntil"," takes precedence over ",[613,2669,866],{},". Without either, drains are awaited (correct for traditional Node.js servers).",[886,2672,2674],{"id":2673},"non-http-runtimes","Non-HTTP runtimes",[609,2676,2677,2678,743,2680,2137],{},"For queue workers, CLI drivers, cron jobs, or durable execution engines, skip the HTTP-shaped helpers and use ",[613,2679,873],{},[613,2681,619],{},[894,2683,2687],{"className":2684,"code":2685,"language":2686,"meta":900,"style":900},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createRequestLogger } from 'evlog\u002Ftoolkit'\n\nasync function processJob(job: Job) {\n  const logger = createRequestLogger({\n    service: 'jobs',\n    context: { jobId: job.id, queue: job.queue },\n  })\n\n  try {\n    await runJob(job)\n    logger.set({ status: 'success' })\n  } catch (err) {\n    logger.error(err)\n    throw err\n  } finally {\n    await logger.emit()\n  }\n}\n","ts",[613,2688,2689,2708,2712,2736,2751,2767,2805,2811,2815,2822,2836,2865,2880,2894,2902,2911,2924,2928],{"__ignoreMap":900},[904,2690,2691,2693,2695,2698,2700,2702,2704,2706],{"class":906,"line":907},[904,2692,1233],{"class":1232},[904,2694,1240],{"class":1239},[904,2696,2697],{"class":1243}," createRequestLogger",[904,2699,1253],{"class":1239},[904,2701,1256],{"class":1232},[904,2703,1259],{"class":1239},[904,2705,619],{"class":913},[904,2707,1265],{"class":1239},[904,2709,2710],{"class":906,"line":1268},[904,2711,1351],{"emptyLinePlaceholder":1350},[904,2713,2714,2717,2719,2722,2724,2727,2729,2732,2734],{"class":906,"line":1276},[904,2715,2716],{"class":1360},"async",[904,2718,1762],{"class":1360},[904,2720,2721],{"class":1397}," processJob",[904,2723,1470],{"class":1239},[904,2725,2726],{"class":1506},"job",[904,2728,1483],{"class":1239},[904,2730,2731],{"class":910}," Job",[904,2733,705],{"class":1239},[904,2735,1273],{"class":1239},[904,2737,2738,2741,2743,2745,2747,2749],{"class":906,"line":1285},[904,2739,2740],{"class":1360},"  const",[904,2742,1683],{"class":1243},[904,2744,1366],{"class":1239},[904,2746,2697],{"class":1397},[904,2748,1470],{"class":1479},[904,2750,1473],{"class":1239},[904,2752,2753,2756,2758,2760,2763,2765],{"class":906,"line":1293},[904,2754,2755],{"class":1479},"    service",[904,2757,1483],{"class":1239},[904,2759,1259],{"class":1239},[904,2761,2762],{"class":913},"jobs",[904,2764,1413],{"class":1239},[904,2766,1282],{"class":1239},[904,2768,2769,2772,2774,2776,2779,2781,2784,2786,2789,2791,2794,2796,2798,2800,2803],{"class":906,"line":1304},[904,2770,2771],{"class":1479},"    context",[904,2773,1483],{"class":1239},[904,2775,1240],{"class":1239},[904,2777,2778],{"class":1479}," jobId",[904,2780,1483],{"class":1239},[904,2782,2783],{"class":1243}," job",[904,2785,1530],{"class":1239},[904,2787,2788],{"class":1243},"id",[904,2790,1247],{"class":1239},[904,2792,2793],{"class":1479}," queue",[904,2795,1483],{"class":1239},[904,2797,2783],{"class":1243},[904,2799,1530],{"class":1239},[904,2801,2802],{"class":1243},"queue",[904,2804,2511],{"class":1239},[904,2806,2807,2809],{"class":906,"line":1318},[904,2808,1662],{"class":1239},[904,2810,1421],{"class":1479},[904,2812,2813],{"class":906,"line":1325},[904,2814,1351],{"emptyLinePlaceholder":1350},[904,2816,2817,2820],{"class":906,"line":1347},[904,2818,2819],{"class":1232},"  try",[904,2821,1273],{"class":1239},[904,2823,2824,2827,2830,2832,2834],{"class":906,"line":1354},[904,2825,2826],{"class":1232},"    await",[904,2828,2829],{"class":1397}," runJob",[904,2831,1470],{"class":1479},[904,2833,2726],{"class":1243},[904,2835,1421],{"class":1479},[904,2837,2838,2841,2843,2846,2848,2850,2852,2854,2856,2859,2861,2863],{"class":906,"line":1372},[904,2839,2840],{"class":1243},"    logger",[904,2842,1530],{"class":1239},[904,2844,2845],{"class":1397},"set",[904,2847,1470],{"class":1479},[904,2849,1954],{"class":1239},[904,2851,1957],{"class":1479},[904,2853,1483],{"class":1239},[904,2855,1259],{"class":1239},[904,2857,2858],{"class":913},"success",[904,2860,1413],{"class":1239},[904,2862,1253],{"class":1239},[904,2864,1421],{"class":1479},[904,2866,2867,2869,2871,2873,2876,2878],{"class":906,"line":1377},[904,2868,1662],{"class":1239},[904,2870,1979],{"class":1232},[904,2872,1503],{"class":1479},[904,2874,2875],{"class":1243},"err",[904,2877,1890],{"class":1479},[904,2879,1473],{"class":1239},[904,2881,2882,2884,2886,2888,2890,2892],{"class":906,"line":1404},[904,2883,2840],{"class":1243},[904,2885,1530],{"class":1239},[904,2887,1984],{"class":1397},[904,2889,1470],{"class":1479},[904,2891,2875],{"class":1243},[904,2893,1421],{"class":1479},[904,2895,2896,2899],{"class":906,"line":1418},[904,2897,2898],{"class":1232},"    throw",[904,2900,2901],{"class":1243}," err\n",[904,2903,2904,2906,2909],{"class":906,"line":1424},[904,2905,1662],{"class":1239},[904,2907,2908],{"class":1232}," finally",[904,2910,1273],{"class":1239},[904,2912,2913,2915,2917,2919,2922],{"class":906,"line":1429},[904,2914,2826],{"class":1232},[904,2916,1683],{"class":1243},[904,2918,1530],{"class":1239},[904,2920,2921],{"class":1397},"emit",[904,2923,1903],{"class":1479},[904,2925,2926],{"class":906,"line":1442},[904,2927,2035],{"class":1239},[904,2929,2930],{"class":906,"line":1447},[904,2931,2041],{"class":1239},[609,2933,2934,2935,2938],{},"Same enrichers, same drain hook, same ",[667,2936,2937],{"href":525},"identity headers"," on outbound HTTP drain requests. Only the entry point shape changes.",[886,2940,2942],{"id":2941},"reference-implementations","Reference implementations",[609,2944,2945],{},"Study these built-in integrations for framework-specific patterns:",[640,2947,2948,2964],{},[643,2949,2950],{},[646,2951,2952,2955,2958,2961],{},[649,2953,2954],{},"Framework",[649,2956,2957],{},"Lines",[649,2959,2960],{},"Mode",[649,2962,2963],{},"Source",[659,2965,2966,2983,2999,3016,3033,3050],{},[646,2967,2968,2970,2973,2976],{},[664,2969,275],{},[664,2971,2972],{},"~50",[664,2974,2975],{},"manifest",[664,2977,2978],{},[667,2979,2982],{"href":2980,"rel":2981},"https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fhono\u002Findex.ts",[884],"hono\u002Findex.ts",[646,2984,2985,2987,2989,2992],{},[664,2986,270],{},[664,2988,2972],{},[664,2990,2991],{},"manifest + ALS",[664,2993,2994],{},[667,2995,2998],{"href":2996,"rel":2997},"https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fexpress\u002Findex.ts",[884],"express\u002Findex.ts",[646,3000,3001,3003,3006,3009],{},[664,3002,280],{},[664,3004,3005],{},"~70",[664,3007,3008],{},"manifest + Fastify hooks",[664,3010,3011],{},[667,3012,3015],{"href":3013,"rel":3014},"https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Ffastify\u002Findex.ts",[884],"fastify\u002Findex.ts",[646,3017,3018,3020,3023,3026],{},[664,3019,285],{},[664,3021,3022],{},"~80",[664,3024,3025],{},"manifest + custom ALS scoping",[664,3027,3028],{},[667,3029,3032],{"href":3030,"rel":3031},"https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Felysia\u002Findex.ts",[884],"elysia\u002Findex.ts",[646,3034,3035,3037,3040,3043],{},[664,3036,265],{},[664,3038,3039],{},"~120",[664,3041,3042],{},"custom (interceptor)",[664,3044,3045],{},[667,3046,3049],{"href":3047,"rel":3048},"https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fnestjs\u002F",[884],"nestjs\u002F",[646,3051,3052,3054,3057,3063],{},[664,3053,250],{},[664,3055,3056],{},"~90",[664,3058,3059,3060,3062],{},"custom (",[613,3061,704],{}," hook)",[664,3064,3065],{},[667,3066,3069],{"href":3067,"rel":3068},"https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog\u002Fblob\u002Fmain\u002Fpackages\u002Fevlog\u002Fsrc\u002Fsveltekit\u002F",[884],"sveltekit\u002F",[630,3071,3074,3075,3080],{"color":3072,"icon":3073},"neutral","i-lucide-heart","Built an integration for a framework we don't support? ",[667,3076,3079],{"href":3077,"rel":3078},"https:\u002F\u002Fgithub.com\u002Fevloghq\u002Fevlog\u002Fpulls",[884],"Open a PR",". The community will thank you.",[886,3082,3084],{"id":3083},"next-steps","Next steps",[731,3086,3087,3093,3099,3104,3109,3114],{},[734,3088,3089,3092],{},[667,3090,3091],{"href":530},"Custom Drains",": same toolkit shape for drain destinations",[734,3094,3095,3098],{},[667,3096,3097],{"href":517},"Custom Enrichers",": same toolkit shape for derived event fields",[734,3100,3101,3103],{},[667,3102,512],{"href":513},": multi-hook extensions (drain + enrich + keep in one object)",[734,3105,3106,3108],{},[667,3107,51],{"href":52},": design comprehensive events with context layering",[734,3110,3111,3113],{},[667,3112,66],{"href":67},": control log volume with head and tail sampling",[734,3115,3116,3118],{},[667,3117,148],{"href":153},": send logs to Axiom, Sentry, PostHog, and more",[3120,3121,3122],"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .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}",{"title":900,"searchDepth":1268,"depth":1268,"links":3124},[3125,3126,3127,3131,3132,3133,3134,3135],{"id":888,"depth":1268,"text":889},{"id":963,"depth":1268,"text":964},{"id":1206,"depth":1268,"text":1207,"children":3128},[3129],{"id":2051,"depth":1276,"text":3130},"What defineFrameworkIntegration does",{"id":2124,"depth":1268,"text":2125},{"id":2264,"depth":1268,"text":2265},{"id":2673,"depth":1268,"text":2674},{"id":2941,"depth":1268,"text":2942},{"id":3083,"depth":1268,"text":3084},"Build evlog support for a framework or runtime that has no integration, with defineFrameworkIntegration or the lower-level helpers.","md",[3139,3141],{"label":3091,"icon":532,"to":530,"color":3072,"variant":3140},"subtle",{"label":3097,"icon":443,"to":517,"color":3072,"variant":3140},{},{"title":494,"icon":497},{"title":604,"description":3136},"ttqRa6aSfHOFKHGY_qdlwidREkM_7IiLGarEuw6UQvU",[3147,3149],{"title":489,"path":490,"stem":491,"description":3148,"icon":492,"children":-1},"Subscribe to wide events flowing through evlog — in-process with createStreamDrain, or over the network with the local SSE stream server.",{"title":499,"path":500,"stem":501,"description":3150,"icon":492,"children":-1},"Publish every wide event on a node:diagnostics_channel, so a consumer subscribes without importing evlog and Cloudflare can Tail Worker it.",1791110183786]