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