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