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