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