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