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