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