[{"data":1,"prerenderedAt":3397},["ShallowReactive",2],{"navigation_docs":3,"-extend-diagnostics-channel":529,"-extend-diagnostics-channel-surround":3392},[4,29,76,122,304,436,495],{"title":5,"path":6,"stem":7,"children":8,"page":28},"Start","\u002Fstart","1.start",[9,13,18,23],{"title":10,"path":11,"stem":12},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction",{"title":14,"path":15,"stem":16,"icon":17},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":19,"path":20,"stem":21,"icon":22},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":24,"path":25,"stem":26,"icon":27},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":30,"path":31,"stem":32,"children":33,"page":28},"Learn","\u002Flearn","2.learn",[34,38,43,48,53,58,62,67,72],{"title":35,"path":36,"stem":37},"Learn evlog","\u002Flearn\u002Foverview","2.learn\u002F0.overview",{"title":39,"path":40,"stem":41,"icon":42},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":44,"path":45,"stem":46,"icon":47},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":49,"path":50,"stem":51,"icon":52},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":54,"path":55,"stem":56,"icon":57},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":59,"path":60,"stem":61},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling",{"title":63,"path":64,"stem":65,"icon":66},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":68,"path":69,"stem":70,"icon":71},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":73,"path":74,"stem":75},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs",{"title":77,"path":78,"stem":79,"children":80,"page":28},"CLI","\u002Fcli","3.cli",[81,85,90,95,99,103,108,113,118],{"title":82,"path":83,"stem":84},"evlog CLI","\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":86,"path":87,"stem":88,"icon":89},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":91,"path":92,"stem":93,"icon":94},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":96,"path":97,"stem":98},"Map rules","\u002Fcli\u002Frules","3.cli\u002F3.rules",{"title":100,"path":101,"stem":102},"Map scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring",{"title":104,"path":105,"stem":106,"icon":107},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":109,"path":110,"stem":111,"icon":112},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":114,"path":115,"stem":116,"icon":117},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":119,"path":120,"stem":121},"evlog agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents",{"title":123,"path":124,"stem":125,"children":126,"page":28},"Integrate","\u002Fintegrate","4.integrate",[127,132,216],{"title":128,"path":129,"stem":130,"icon":131},"Overview","\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":133,"path":134,"stem":135,"children":136,"page":28},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[137,141,171,196],{"title":128,"path":138,"stem":139,"icon":140},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview","i-lucide-list",{"title":142,"path":143,"stem":144,"children":145,"page":28},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[146,151,156,161,166],{"title":147,"path":148,"stem":149,"icon":150},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":152,"path":153,"stem":154,"icon":155},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":157,"path":158,"stem":159,"icon":160},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":162,"path":163,"stem":164,"icon":165},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":167,"path":168,"stem":169,"icon":170},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":172,"path":173,"stem":174,"children":175,"page":28},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[176,181,186,191],{"title":177,"path":178,"stem":179,"icon":180},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":182,"path":183,"stem":184,"icon":185},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":187,"path":188,"stem":189,"icon":190},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":192,"path":193,"stem":194,"icon":195},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":197,"path":198,"stem":199,"children":200,"page":28},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[201,206,211],{"title":202,"path":203,"stem":204,"icon":205},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":207,"path":208,"stem":209,"icon":210},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":212,"path":213,"stem":214,"icon":215},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":217,"path":218,"stem":219,"children":220,"page":28},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[221,225,230,235,240,245,250,255,260,265,270,275,280,285,289,294,299],{"title":128,"path":222,"stem":223,"icon":224},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":226,"path":227,"stem":228,"icon":229},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":231,"path":232,"stem":233,"icon":234},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":236,"path":237,"stem":238,"icon":239},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":241,"path":242,"stem":243,"icon":244},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":246,"path":247,"stem":248,"icon":249},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":251,"path":252,"stem":253,"icon":254},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":256,"path":257,"stem":258,"icon":259},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":261,"path":262,"stem":263,"icon":264},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":266,"path":267,"stem":268,"icon":269},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":271,"path":272,"stem":273,"icon":274},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":276,"path":277,"stem":278,"icon":279},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":281,"path":282,"stem":283,"icon":284},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":286,"path":287,"stem":288,"icon":71},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":290,"path":291,"stem":292,"icon":293},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":295,"path":296,"stem":297,"icon":298},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":300,"path":301,"stem":302,"icon":303},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":305,"path":306,"stem":307,"children":308,"page":28},"Use Cases","\u002Fuse-cases","5.use-cases",[309,312,317,346,374,407,427,432],{"title":305,"path":310,"stem":311},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":313,"path":314,"stem":315,"icon":316},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":318,"icon":319,"path":320,"stem":321,"children":322,"page":28},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[323,326,331,336,341],{"title":128,"path":324,"stem":325,"icon":140},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":327,"path":328,"stem":329,"icon":330},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":332,"path":333,"stem":334,"icon":335},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":337,"path":338,"stem":339,"icon":340},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":342,"path":343,"stem":344,"icon":345},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":347,"icon":348,"path":349,"stem":350,"children":351,"page":28},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[352,355,360,365,369],{"title":128,"path":353,"stem":354,"icon":140},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":356,"path":357,"stem":358,"icon":359},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":361,"path":362,"stem":363,"icon":364},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":366,"path":367,"stem":368,"icon":316},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":370,"path":371,"stem":372,"icon":373},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":375,"icon":376,"path":377,"stem":378,"children":379,"page":28},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[380,383,388,393,398,402],{"title":128,"path":381,"stem":382,"icon":140},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":384,"path":385,"stem":386,"icon":387},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":389,"path":390,"stem":391,"icon":392},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":394,"path":395,"stem":396,"icon":397},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":399,"path":400,"stem":401,"icon":376},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":403,"path":404,"stem":405,"icon":406},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes","i-lucide-book-open",{"title":342,"icon":373,"path":408,"stem":409,"children":410,"page":28},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[411,414,419,423],{"title":128,"path":412,"stem":413,"icon":140},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":415,"path":416,"stem":417,"icon":418},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":420,"path":421,"stem":422},"Telemetry Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest",{"title":424,"path":425,"stem":426,"icon":406},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":428,"path":429,"stem":430,"icon":431},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":433,"path":434,"stem":435},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve",{"title":437,"path":438,"stem":439,"children":440,"page":28},"Extend","\u002Fextend","6.extend",[441,445,450,455,459,464,468,472,476,481,486,491],{"title":128,"path":442,"stem":443,"icon":444},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":446,"path":447,"stem":448,"icon":449},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":451,"path":452,"stem":453,"icon":454},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":456,"path":457,"stem":458,"icon":449},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":460,"path":461,"stem":462,"icon":463},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":403,"path":465,"stem":466,"icon":467},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":469,"path":470,"stem":471},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":473,"path":474,"stem":475,"icon":431},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":477,"path":478,"stem":479,"icon":480},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling","i-lucide-filter",{"title":482,"path":483,"stem":484,"icon":485},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":487,"path":488,"stem":489,"icon":490},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":492,"path":493,"stem":494},"Drain Pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline",{"title":424,"path":496,"stem":497,"children":498,"page":28},"\u002Freference","7.reference",[499,504,507,512,516,521,525],{"title":500,"path":501,"stem":502,"icon":503},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":370,"path":505,"stem":506,"icon":373},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":508,"path":509,"stem":510,"icon":511},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":513,"path":514,"stem":515,"icon":376},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":517,"path":518,"stem":519,"icon":520},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":522,"path":523,"stem":524,"icon":431},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":526,"path":527,"stem":528},"Log cost","\u002Freference\u002Fcost","7.reference\u002F7.cost",{"id":530,"title":531,"body":532,"description":3380,"extension":3381,"links":3382,"meta":3388,"navigation":3389,"path":457,"seo":3390,"stem":458,"__hash__":3391},"docs\u002F6.extend\u002F11.diagnostics-channel.md","Diagnostics Channel",{"type":533,"value":534,"toc":3368},"minimark",[535,557,562,573,602,609,613,616,677,685,1527,1542,1554,1558,1561,1790,1804,1807,1997,2007,2011,2014,2300,2322,2335,2342,2346,2351,2357,2584,2601,2606,2610,2613,3010,3016,3019,3030,3258,3279,3283,3290,3358,3364],[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":470},"plugin"," or a ",[539,570,571],{"href":488},"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":231,"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":236,"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":261,"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":281,"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":286,"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, 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 ",[545,1537,670],{}," should call it from the same place they call ",[545,1540,555],{},", and await it there.",[1543,1544,1547,1548,1550,1551,1553],"callout",{"color":1545,"icon":1546},"info","i-lucide-info","This is an observation side channel, not a transport. Subscribers run synchronously and are not awaited: no batching, no retry, no ",[545,1549,600],{},". For delivery to a backend, use a ",[539,1552,571],{"href":488},"; both see the same event.",[558,1555,1557],{"id":1556},"subscribing","Subscribing",[536,1559,1560],{},"The point of the channel is that a consumer needs nothing from evlog but the channel name:",[617,1562,1565],{"className":619,"code":1563,"filename":1564,"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,1566,1567,1586,1590,1595,1657,1661,1693,1714,1784],{"__ignoreMap":622},[626,1568,1569,1571,1573,1576,1578,1580,1582,1584],{"class":628,"line":629},[626,1570,633],{"class":632},[626,1572,637],{"class":636},[626,1574,1575],{"class":640}," channel",[626,1577,644],{"class":636},[626,1579,647],{"class":632},[626,1581,650],{"class":636},[626,1583,547],{"class":653},[626,1585,657],{"class":636},[626,1587,1588],{"class":628,"line":660},[626,1589,664],{"emptyLinePlaceholder":663},[626,1591,1592],{"class":628,"line":667},[626,1593,1594],{"class":698},"\u002F** The published message. Declared locally so this file needs no evlog import. *\u002F\n",[626,1596,1597,1600,1604,1606,1608,1611,1613,1616,1619,1622,1624,1627,1630,1633,1635,1638,1640,1643,1646,1648,1650,1652,1654],{"class":628,"line":724},[626,1598,1599],{"class":739},"type",[626,1601,1603],{"class":1602},"sBMFI"," EvlogMessage",[626,1605,826],{"class":636},[626,1607,637],{"class":636},[626,1609,1610],{"class":760}," event",[626,1612,572],{"class":636},[626,1614,1615],{"class":1602}," Record",[626,1617,1618],{"class":636},"\u003C",[626,1620,1621],{"class":1602},"string",[626,1623,818],{"class":636},[626,1625,1626],{"class":1602}," unknown",[626,1628,1629],{"class":636},">",[626,1631,1632],{"class":636}," &",[626,1634,637],{"class":636},[626,1636,1637],{"class":760}," level",[626,1639,572],{"class":636},[626,1641,1642],{"class":1602}," string",[626,1644,1645],{"class":636},";",[626,1647,929],{"class":760},[626,1649,572],{"class":636},[626,1651,1642],{"class":1602},[626,1653,644],{"class":636},[626,1655,1656],{"class":636}," }\n",[626,1658,1659],{"class":628,"line":752},[626,1660,664],{"emptyLinePlaceholder":663},[626,1662,1663,1666,1668,1670,1672,1674,1677,1680,1682,1684,1687,1689,1691],{"class":628,"line":763},[626,1664,1665],{"class":1602},"channel",[626,1667,736],{"class":640},[626,1669,863],{"class":636},[626,1671,551],{"class":653},[626,1673,863],{"class":636},[626,1675,1676],{"class":640},").",[626,1678,1679],{"class":1602},"subscribe",[626,1681,736],{"class":640},[626,1683,736],{"class":636},[626,1685,1686],{"class":1348},"message",[626,1688,1366],{"class":636},[626,1690,746],{"class":739},[626,1692,749],{"class":636},[626,1694,1695,1697,1699,1701,1703,1706,1708,1711],{"class":628,"line":899},[626,1696,843],{"class":1602},[626,1698,637],{"class":636},[626,1700,1610],{"class":760},[626,1702,644],{"class":636},[626,1704,1705],{"class":640}," = ",[626,1707,1686],{"class":1602},[626,1709,1710],{"class":1602}," as",[626,1712,1713],{"class":760}," EvlogMessage\n",[626,1715,1716,1719,1721,1724,1726,1729,1731,1733,1736,1739,1741,1743,1746,1748,1750,1752,1755,1757,1760,1763,1765,1768,1771,1773,1776,1778,1781],{"class":628,"line":945},[626,1717,1718],{"class":760},"  if",[626,1720,1345],{"class":636},[626,1722,1723],{"class":640},"event.level === ",[626,1725,863],{"class":636},[626,1727,1728],{"class":653},"error",[626,1730,863],{"class":636},[626,1732,1366],{"class":636},[626,1734,1735],{"class":640}," metrics.",[626,1737,1738],{"class":760},"increment",[626,1740,736],{"class":636},[626,1742,863],{"class":636},[626,1744,1745],{"class":653},"errors",[626,1747,863],{"class":636},[626,1749,818],{"class":636},[626,1751,637],{"class":636},[626,1753,1754],{"class":760}," path",[626,1756,572],{"class":636},[626,1758,1759],{"class":1348}," String",[626,1761,1762],{"class":640},"(event",[626,1764,556],{"class":636},[626,1766,1767],{"class":640},"path ",[626,1769,1770],{"class":636},"??",[626,1772,650],{"class":636},[626,1774,1775],{"class":653},"unknown",[626,1777,863],{"class":636},[626,1779,1780],{"class":640},") ",[626,1782,1783],{"class":636},"})\n",[626,1785,1786,1788],{"class":628,"line":950},[626,1787,766],{"class":636},[626,1789,769],{"class":640},[536,1791,1792,1793,1795,1796,1799,1800,1803],{},"Node types the published message as ",[545,1794,1775],{},", so narrow it once at the top of your handler. ",[545,1797,1798],{},"channel(name).subscribe()"," is used rather than the module-level ",[545,1801,1802],{},"subscribe()"," because it exists on every Node that evlog supports.",[536,1805,1806],{},"If you already depend on evlog and want the payload typed:",[617,1808,1811],{"className":619,"code":1809,"filename":1810,"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,1812,1813,1832,1836,1862,1867,1914,1987,1991],{"__ignoreMap":622},[626,1814,1815,1817,1819,1822,1824,1826,1828,1830],{"class":628,"line":629},[626,1816,633],{"class":632},[626,1818,637],{"class":636},[626,1820,1821],{"class":640}," subscribeToWideEvents",[626,1823,644],{"class":636},[626,1825,647],{"class":632},[626,1827,650],{"class":636},[626,1829,654],{"class":653},[626,1831,657],{"class":636},[626,1833,1834],{"class":628,"line":660},[626,1835,664],{"emptyLinePlaceholder":663},[626,1837,1838,1840,1843,1845,1847,1849,1851,1853,1856,1858,1860],{"class":628,"line":667},[626,1839,1197],{"class":739},[626,1841,1842],{"class":640}," stop ",[626,1844,1203],{"class":636},[626,1846,855],{"class":632},[626,1848,1821],{"class":673},[626,1850,736],{"class":640},[626,1852,736],{"class":636},[626,1854,1855],{"class":1348},"event",[626,1857,1366],{"class":636},[626,1859,746],{"class":739},[626,1861,749],{"class":636},[626,1863,1864],{"class":628,"line":724},[626,1865,1866],{"class":698},"  \u002F\u002F                                       ^? WideEvent\n",[626,1868,1869,1871,1873,1876,1878,1880,1883,1886,1888,1891,1893,1896,1898,1900,1902,1905,1909,1911],{"class":628,"line":752},[626,1870,1718],{"class":632},[626,1872,1345],{"class":760},[626,1874,1875],{"class":636},"typeof",[626,1877,1610],{"class":640},[626,1879,556],{"class":636},[626,1881,1882],{"class":640},"status",[626,1884,1885],{"class":636}," ===",[626,1887,650],{"class":636},[626,1889,1890],{"class":653},"number",[626,1892,863],{"class":636},[626,1894,1895],{"class":636}," &&",[626,1897,1610],{"class":640},[626,1899,556],{"class":636},[626,1901,1882],{"class":640},[626,1903,1904],{"class":636}," >=",[626,1906,1908],{"class":1907},"sbssI"," 500",[626,1910,1780],{"class":760},[626,1912,1913],{"class":636},"{\n",[626,1915,1916,1919,1921,1924,1926,1928,1930,1932,1934,1936,1938,1940,1943,1946,1948,1951,1953,1955,1957,1960,1962,1964,1966,1968,1970,1973,1975,1977,1979,1981,1983,1985],{"class":628,"line":763},[626,1917,1918],{"class":640},"    alerts",[626,1920,556],{"class":636},[626,1922,1923],{"class":673},"push",[626,1925,736],{"class":760},[626,1927,926],{"class":636},[626,1929,1754],{"class":760},[626,1931,572],{"class":636},[626,1933,1759],{"class":673},[626,1935,736],{"class":760},[626,1937,1855],{"class":640},[626,1939,556],{"class":636},[626,1941,1942],{"class":640},"path",[626,1944,1945],{"class":636}," ??",[626,1947,650],{"class":636},[626,1949,1950],{"class":653},"-",[626,1952,863],{"class":636},[626,1954,1366],{"class":760},[626,1956,818],{"class":636},[626,1958,1959],{"class":760}," requestId",[626,1961,572],{"class":636},[626,1963,1759],{"class":673},[626,1965,736],{"class":760},[626,1967,1855],{"class":640},[626,1969,556],{"class":636},[626,1971,1972],{"class":640},"requestId",[626,1974,1945],{"class":636},[626,1976,650],{"class":636},[626,1978,1950],{"class":653},[626,1980,863],{"class":636},[626,1982,1780],{"class":760},[626,1984,766],{"class":636},[626,1986,769],{"class":760},[626,1988,1989],{"class":628,"line":899},[626,1990,1008],{"class":636},[626,1992,1993,1995],{"class":628,"line":945},[626,1994,766],{"class":636},[626,1996,769],{"class":640},[536,1998,1999,2000,2003,2004,2006],{},"Fields beyond the ",[539,2001,2002],{"href":45},"base event"," are typed ",[545,2005,1775],{},", and events emitted outside a request carry no HTTP fields at all, so narrow before using them rather than casting.",[558,2008,2010],{"id":2009},"what-a-subscriber-receives","What a subscriber receives",[536,2012,2013],{},"The same object a drain receives: post-audit, post-redaction, post-enrich. Requests carry everything enrichers added: geo, user agent, trace context:",[617,2015,2018],{"className":2016,"code":2017,"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,2019,2020,2024,2047,2066,2086,2106,2126,2145,2159,2179,2198,2248,2295],{"__ignoreMap":622},[626,2021,2022],{"class":628,"line":629},[626,2023,1913],{"class":636},[626,2025,2026,2029,2032,2035,2037,2040,2043,2045],{"class":628,"line":660},[626,2027,2028],{"class":636},"  \"",[626,2030,2031],{"class":739},"timestamp",[626,2033,2034],{"class":636},"\"",[626,2036,572],{"class":636},[626,2038,2039],{"class":636}," \"",[626,2041,2042],{"class":653},"2026-08-02T10:23:45.612Z",[626,2044,2034],{"class":636},[626,2046,1002],{"class":636},[626,2048,2049,2051,2054,2056,2058,2060,2062,2064],{"class":628,"line":667},[626,2050,2028],{"class":636},[626,2052,2053],{"class":739},"level",[626,2055,2034],{"class":636},[626,2057,572],{"class":636},[626,2059,2039],{"class":636},[626,2061,1728],{"class":653},[626,2063,2034],{"class":636},[626,2065,1002],{"class":636},[626,2067,2068,2070,2073,2075,2077,2079,2082,2084],{"class":628,"line":724},[626,2069,2028],{"class":636},[626,2071,2072],{"class":739},"service",[626,2074,2034],{"class":636},[626,2076,572],{"class":636},[626,2078,2039],{"class":636},[626,2080,2081],{"class":653},"checkout",[626,2083,2034],{"class":636},[626,2085,1002],{"class":636},[626,2087,2088,2090,2093,2095,2097,2099,2102,2104],{"class":628,"line":752},[626,2089,2028],{"class":636},[626,2091,2092],{"class":739},"environment",[626,2094,2034],{"class":636},[626,2096,572],{"class":636},[626,2098,2039],{"class":636},[626,2100,2101],{"class":653},"production",[626,2103,2034],{"class":636},[626,2105,1002],{"class":636},[626,2107,2108,2110,2113,2115,2117,2119,2122,2124],{"class":628,"line":763},[626,2109,2028],{"class":636},[626,2111,2112],{"class":739},"method",[626,2114,2034],{"class":636},[626,2116,572],{"class":636},[626,2118,2039],{"class":636},[626,2120,2121],{"class":653},"POST",[626,2123,2034],{"class":636},[626,2125,1002],{"class":636},[626,2127,2128,2130,2132,2134,2136,2138,2141,2143],{"class":628,"line":899},[626,2129,2028],{"class":636},[626,2131,1942],{"class":739},[626,2133,2034],{"class":636},[626,2135,572],{"class":636},[626,2137,2039],{"class":636},[626,2139,2140],{"class":653},"\u002Fapi\u002Fcheckout",[626,2142,2034],{"class":636},[626,2144,1002],{"class":636},[626,2146,2147,2149,2151,2153,2155,2157],{"class":628,"line":945},[626,2148,2028],{"class":636},[626,2150,1882],{"class":739},[626,2152,2034],{"class":636},[626,2154,572],{"class":636},[626,2156,1908],{"class":1907},[626,2158,1002],{"class":636},[626,2160,2161,2163,2166,2168,2170,2172,2175,2177],{"class":628,"line":950},[626,2162,2028],{"class":636},[626,2164,2165],{"class":739},"duration",[626,2167,2034],{"class":636},[626,2169,572],{"class":636},[626,2171,2039],{"class":636},[626,2173,2174],{"class":653},"1.20s",[626,2176,2034],{"class":636},[626,2178,1002],{"class":636},[626,2180,2181,2183,2185,2187,2189,2191,2194,2196],{"class":628,"line":958},[626,2182,2028],{"class":636},[626,2184,1972],{"class":739},[626,2186,2034],{"class":636},[626,2188,572],{"class":636},[626,2190,2039],{"class":636},[626,2192,2193],{"class":653},"4a8ff3a8-...",[626,2195,2034],{"class":636},[626,2197,1002],{"class":636},[626,2199,2200,2202,2205,2207,2209,2211,2213,2216,2218,2220,2222,2225,2227,2229,2231,2234,2236,2238,2240,2243,2245],{"class":628,"line":971},[626,2201,2028],{"class":636},[626,2203,2204],{"class":739},"user",[626,2206,2034],{"class":636},[626,2208,572],{"class":636},[626,2210,637],{"class":636},[626,2212,2039],{"class":636},[626,2214,2215],{"class":1602},"id",[626,2217,2034],{"class":636},[626,2219,572],{"class":636},[626,2221,2039],{"class":636},[626,2223,2224],{"class":653},"usr_123",[626,2226,2034],{"class":636},[626,2228,818],{"class":636},[626,2230,2039],{"class":636},[626,2232,2233],{"class":1602},"plan",[626,2235,2034],{"class":636},[626,2237,572],{"class":636},[626,2239,2039],{"class":636},[626,2241,2242],{"class":653},"premium",[626,2244,2034],{"class":636},[626,2246,2247],{"class":636}," },\n",[626,2249,2250,2252,2254,2256,2258,2260,2262,2265,2267,2269,2271,2274,2276,2278,2280,2282,2284,2286,2288,2291,2293],{"class":628,"line":981},[626,2251,2028],{"class":636},[626,2253,1728],{"class":739},[626,2255,2034],{"class":636},[626,2257,572],{"class":636},[626,2259,637],{"class":636},[626,2261,2039],{"class":636},[626,2263,2264],{"class":1602},"name",[626,2266,2034],{"class":636},[626,2268,572],{"class":636},[626,2270,2039],{"class":636},[626,2272,2273],{"class":653},"PaymentDeclined",[626,2275,2034],{"class":636},[626,2277,818],{"class":636},[626,2279,2039],{"class":636},[626,2281,1686],{"class":1602},[626,2283,2034],{"class":636},[626,2285,572],{"class":636},[626,2287,2039],{"class":636},[626,2289,2290],{"class":653},"Card declined",[626,2292,2034],{"class":636},[626,2294,1656],{"class":636},[626,2296,2297],{"class":628,"line":990},[626,2298,2299],{"class":636},"}\n",[536,2301,2302,2303,2306,2307,2310,2311,2314,2315,2318,2319,556],{},"Events emitted outside a request (",[545,2304,2305],{},"log.info({ ... })",", ",[545,2308,2309],{},"createLogger().emit()",") arrive without the HTTP fields, and events from ",[545,2312,2313],{},"log.fork()"," carry ",[545,2316,2317],{},"operation"," and ",[545,2320,2321],{},"_parentRequestId",[1543,2323,2326,2327,2330,2331,2334],{"color":2324,"icon":2325},"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 ",[580,2328,2329],{},"not"," contained: ",[545,2332,2333],{},"Channel.publish()"," re-raises it as an uncaught exception on the next tick, which is fatal in most apps. Keep subscribers total.",[536,2336,2337,2338,2341],{},"In pretty mode (the dev default), tagged logs like ",[545,2339,2340],{},"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,2343,2345],{"id":2344},"what-you-can-build","What you can build",[2347,2348,2350],"h3",{"id":2349},"an-integration-that-does-not-depend-on-evlog","An integration that does not depend on evlog",[536,2352,2353,2354,2356],{},"A package that subscribes needs the channel name and nothing else: no ",[545,2355,1225],{}," dependency, no peer range to keep in sync, no wiring in the host app beyond importing it:",[617,2358,2361],{"className":619,"code":2359,"filename":2360,"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,2362,2363,2381,2385,2395,2443,2447,2451,2479,2497,2501,2515,2530,2545,2560,2571,2578],{"__ignoreMap":622},[626,2364,2365,2367,2369,2371,2373,2375,2377,2379],{"class":628,"line":629},[626,2366,633],{"class":632},[626,2368,637],{"class":636},[626,2370,1575],{"class":640},[626,2372,644],{"class":636},[626,2374,647],{"class":632},[626,2376,650],{"class":636},[626,2378,547],{"class":653},[626,2380,657],{"class":636},[626,2382,2383],{"class":628,"line":660},[626,2384,664],{"emptyLinePlaceholder":663},[626,2386,2387,2389,2391,2393],{"class":628,"line":667},[626,2388,1599],{"class":739},[626,2390,1603],{"class":1602},[626,2392,826],{"class":636},[626,2394,749],{"class":636},[626,2396,2397,2400,2402,2404,2406,2408,2410,2412,2414,2416,2418,2421,2423,2425,2427,2429,2431,2433,2435,2437,2439,2441],{"class":628,"line":724},[626,2398,2399],{"class":760},"  event",[626,2401,572],{"class":636},[626,2403,1615],{"class":1602},[626,2405,1618],{"class":636},[626,2407,1621],{"class":1602},[626,2409,818],{"class":636},[626,2411,1626],{"class":1602},[626,2413,1629],{"class":636},[626,2415,1632],{"class":636},[626,2417,637],{"class":636},[626,2419,2420],{"class":760}," timestamp",[626,2422,572],{"class":636},[626,2424,1642],{"class":1602},[626,2426,1645],{"class":636},[626,2428,1637],{"class":760},[626,2430,572],{"class":636},[626,2432,1642],{"class":1602},[626,2434,1645],{"class":636},[626,2436,929],{"class":760},[626,2438,572],{"class":636},[626,2440,1642],{"class":1602},[626,2442,1656],{"class":636},[626,2444,2445],{"class":628,"line":752},[626,2446,2299],{"class":636},[626,2448,2449],{"class":628,"line":763},[626,2450,664],{"emptyLinePlaceholder":663},[626,2452,2453,2455,2457,2459,2461,2463,2465,2467,2469,2471,2473,2475,2477],{"class":628,"line":899},[626,2454,1665],{"class":1602},[626,2456,736],{"class":640},[626,2458,863],{"class":636},[626,2460,551],{"class":653},[626,2462,863],{"class":636},[626,2464,1676],{"class":640},[626,2466,1679],{"class":1602},[626,2468,736],{"class":640},[626,2470,736],{"class":636},[626,2472,1686],{"class":1348},[626,2474,1366],{"class":636},[626,2476,746],{"class":739},[626,2478,749],{"class":636},[626,2480,2481,2483,2485,2487,2489,2491,2493,2495],{"class":628,"line":945},[626,2482,843],{"class":1602},[626,2484,637],{"class":636},[626,2486,1610],{"class":760},[626,2488,644],{"class":636},[626,2490,1705],{"class":640},[626,2492,1686],{"class":1602},[626,2494,1710],{"class":1602},[626,2496,1713],{"class":760},[626,2498,2499],{"class":628,"line":950},[626,2500,664],{"emptyLinePlaceholder":663},[626,2502,2503,2506,2508,2511,2513],{"class":628,"line":958},[626,2504,2505],{"class":1602},"  acme",[626,2507,556],{"class":636},[626,2509,2510],{"class":1602},"ingest",[626,2512,736],{"class":640},[626,2514,1913],{"class":636},[626,2516,2517,2520,2522,2524,2526,2528],{"class":628,"line":971},[626,2518,2519],{"class":760},"    at",[626,2521,572],{"class":636},[626,2523,1610],{"class":1602},[626,2525,556],{"class":636},[626,2527,2031],{"class":1602},[626,2529,1002],{"class":636},[626,2531,2532,2535,2537,2539,2541,2543],{"class":628,"line":981},[626,2533,2534],{"class":760},"    level",[626,2536,572],{"class":636},[626,2538,1610],{"class":1602},[626,2540,556],{"class":636},[626,2542,2053],{"class":1602},[626,2544,1002],{"class":636},[626,2546,2547,2550,2552,2554,2556,2558],{"class":628,"line":990},[626,2548,2549],{"class":760},"    service",[626,2551,572],{"class":636},[626,2553,1610],{"class":1602},[626,2555,556],{"class":636},[626,2557,2072],{"class":1602},[626,2559,1002],{"class":636},[626,2561,2562,2565,2567,2569],{"class":628,"line":996},[626,2563,2564],{"class":760},"    attributes",[626,2566,572],{"class":636},[626,2568,1610],{"class":1602},[626,2570,1002],{"class":636},[626,2572,2573,2576],{"class":628,"line":1005},[626,2574,2575],{"class":636},"  }",[626,2577,769],{"class":640},[626,2579,2580,2582],{"class":628,"line":1011},[626,2581,766],{"class":636},[626,2583,769],{"class":640},[617,2585,2588],{"className":619,"code":2586,"filename":2587,"language":621,"meta":622,"style":622},"import 'acme-apm\u002Fevlog'\n","the host app",[545,2589,2590],{"__ignoreMap":622},[626,2591,2592,2594,2596,2599],{"class":628,"line":629},[626,2593,633],{"class":632},[626,2595,650],{"class":636},[626,2597,2598],{"class":653},"acme-apm\u002Fevlog",[626,2600,657],{"class":636},[536,2602,2603,2604,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,2605,555],{},[2347,2607,2609],{"id":2608},"counters-and-alerts-next-to-your-app","Counters and alerts next to your app",[536,2611,2612],{},"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,2614,2617],{"className":619,"code":2615,"filename":2616,"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,2618,2619,2637,2641,2668,2672,2702,2751,2777,2781,2809,2855,2859,2897,2944,2948,2954,2958,2986,3005],{"__ignoreMap":622},[626,2620,2621,2623,2625,2627,2629,2631,2633,2635],{"class":628,"line":629},[626,2622,633],{"class":632},[626,2624,637],{"class":636},[626,2626,1575],{"class":640},[626,2628,644],{"class":636},[626,2630,647],{"class":632},[626,2632,650],{"class":636},[626,2634,547],{"class":653},[626,2636,657],{"class":636},[626,2638,2639],{"class":628,"line":660},[626,2640,664],{"emptyLinePlaceholder":663},[626,2642,2643,2645,2648,2650,2652,2655,2657,2659,2661,2664,2666],{"class":628,"line":667},[626,2644,1197],{"class":739},[626,2646,2647],{"class":640}," errorsByPath ",[626,2649,1203],{"class":636},[626,2651,1206],{"class":636},[626,2653,2654],{"class":673}," Map",[626,2656,1618],{"class":636},[626,2658,1621],{"class":1602},[626,2660,818],{"class":636},[626,2662,2663],{"class":1602}," number",[626,2665,1629],{"class":636},[626,2667,676],{"class":640},[626,2669,2670],{"class":628,"line":724},[626,2671,664],{"emptyLinePlaceholder":663},[626,2673,2674,2676,2678,2680,2682,2684,2686,2688,2690,2692,2694,2696,2698,2700],{"class":628,"line":752},[626,2675,1665],{"class":673},[626,2677,736],{"class":640},[626,2679,863],{"class":636},[626,2681,551],{"class":653},[626,2683,863],{"class":636},[626,2685,1366],{"class":640},[626,2687,556],{"class":636},[626,2689,1679],{"class":673},[626,2691,736],{"class":640},[626,2693,736],{"class":636},[626,2695,1686],{"class":1348},[626,2697,1366],{"class":636},[626,2699,746],{"class":739},[626,2701,749],{"class":636},[626,2703,2704,2706,2708,2710,2712,2714,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735,2737,2739,2741,2743,2745,2747,2749],{"class":628,"line":763},[626,2705,843],{"class":739},[626,2707,637],{"class":636},[626,2709,1610],{"class":640},[626,2711,644],{"class":636},[626,2713,826],{"class":636},[626,2715,2716],{"class":640}," message",[626,2718,1710],{"class":632},[626,2720,637],{"class":636},[626,2722,1610],{"class":760},[626,2724,572],{"class":636},[626,2726,1615],{"class":1602},[626,2728,1618],{"class":636},[626,2730,1621],{"class":1602},[626,2732,818],{"class":636},[626,2734,1626],{"class":1602},[626,2736,1629],{"class":636},[626,2738,1632],{"class":636},[626,2740,637],{"class":636},[626,2742,1637],{"class":760},[626,2744,572],{"class":636},[626,2746,1642],{"class":1602},[626,2748,644],{"class":636},[626,2750,1656],{"class":636},[626,2752,2753,2755,2757,2759,2761,2763,2766,2768,2770,2772,2774],{"class":628,"line":899},[626,2754,1718],{"class":632},[626,2756,1345],{"class":760},[626,2758,1855],{"class":640},[626,2760,556],{"class":636},[626,2762,2053],{"class":640},[626,2764,2765],{"class":636}," !==",[626,2767,650],{"class":636},[626,2769,1728],{"class":653},[626,2771,863],{"class":636},[626,2773,1780],{"class":760},[626,2775,2776],{"class":632},"return\n",[626,2778,2779],{"class":628,"line":945},[626,2780,664],{"emptyLinePlaceholder":663},[626,2782,2783,2785,2787,2789,2791,2793,2795,2797,2799,2801,2803,2805,2807],{"class":628,"line":950},[626,2784,843],{"class":739},[626,2786,1754],{"class":640},[626,2788,826],{"class":636},[626,2790,1759],{"class":673},[626,2792,736],{"class":760},[626,2794,1855],{"class":640},[626,2796,556],{"class":636},[626,2798,1942],{"class":640},[626,2800,1945],{"class":636},[626,2802,650],{"class":636},[626,2804,1775],{"class":653},[626,2806,863],{"class":636},[626,2808,769],{"class":760},[626,2810,2811,2814,2816,2818,2820,2822,2824,2826,2829,2831,2834,2836,2838,2840,2842,2845,2847,2850,2853],{"class":628,"line":958},[626,2812,2813],{"class":640},"  errorsByPath",[626,2815,556],{"class":636},[626,2817,1380],{"class":673},[626,2819,736],{"class":760},[626,2821,1942],{"class":640},[626,2823,818],{"class":636},[626,2825,1345],{"class":760},[626,2827,2828],{"class":640},"errorsByPath",[626,2830,556],{"class":636},[626,2832,2833],{"class":673},"get",[626,2835,736],{"class":760},[626,2837,1942],{"class":640},[626,2839,1780],{"class":760},[626,2841,1770],{"class":636},[626,2843,2844],{"class":1907}," 0",[626,2846,1780],{"class":760},[626,2848,2849],{"class":636},"+",[626,2851,2852],{"class":1907}," 1",[626,2854,769],{"class":760},[626,2856,2857],{"class":628,"line":971},[626,2858,664],{"emptyLinePlaceholder":663},[626,2860,2861,2863,2865,2867,2869,2871,2873,2875,2877,2879,2881,2883,2885,2887,2889,2891,2893,2895],{"class":628,"line":981},[626,2862,1718],{"class":632},[626,2864,1345],{"class":760},[626,2866,1875],{"class":636},[626,2868,1610],{"class":640},[626,2870,556],{"class":636},[626,2872,1882],{"class":640},[626,2874,1885],{"class":636},[626,2876,650],{"class":636},[626,2878,1890],{"class":653},[626,2880,863],{"class":636},[626,2882,1895],{"class":636},[626,2884,1610],{"class":640},[626,2886,556],{"class":636},[626,2888,1882],{"class":640},[626,2890,1904],{"class":636},[626,2892,1908],{"class":1907},[626,2894,1780],{"class":760},[626,2896,1913],{"class":636},[626,2898,2899,2902,2905,2907,2910,2912,2915,2918,2921,2923,2926,2928,2930,2932,2934,2936,2938,2940,2942],{"class":628,"line":990},[626,2900,2901],{"class":636},"    void",[626,2903,2904],{"class":640}," pager",[626,2906,556],{"class":636},[626,2908,2909],{"class":673},"notify",[626,2911,736],{"class":760},[626,2913,2914],{"class":636},"`",[626,2916,2917],{"class":653},"5xx on ",[626,2919,2920],{"class":636},"${",[626,2922,1942],{"class":640},[626,2924,2925],{"class":636},"}`",[626,2927,818],{"class":636},[626,2929,637],{"class":636},[626,2931,1959],{"class":760},[626,2933,572],{"class":636},[626,2935,1610],{"class":640},[626,2937,556],{"class":636},[626,2939,1972],{"class":640},[626,2941,644],{"class":636},[626,2943,769],{"class":760},[626,2945,2946],{"class":628,"line":996},[626,2947,1008],{"class":636},[626,2949,2950,2952],{"class":628,"line":1005},[626,2951,766],{"class":636},[626,2953,769],{"class":640},[626,2955,2956],{"class":628,"line":1011},[626,2957,664],{"emptyLinePlaceholder":663},[626,2959,2961,2963,2966,2969,2972,2974,2976,2978,2980,2982,2984],{"class":628,"line":2960},17,[626,2962,727],{"class":632},[626,2964,2965],{"class":739}," function",[626,2967,2968],{"class":673}," errorCounts",[626,2970,2971],{"class":636},"():",[626,2973,1615],{"class":1602},[626,2975,1618],{"class":636},[626,2977,1621],{"class":1602},[626,2979,818],{"class":636},[626,2981,2663],{"class":1602},[626,2983,1629],{"class":636},[626,2985,749],{"class":636},[626,2987,2989,2991,2994,2996,2999,3001,3003],{"class":628,"line":2988},18,[626,2990,953],{"class":632},[626,2992,2993],{"class":640}," Object",[626,2995,556],{"class":636},[626,2997,2998],{"class":673},"fromEntries",[626,3000,736],{"class":760},[626,3002,2828],{"class":640},[626,3004,769],{"class":760},[626,3006,3008],{"class":628,"line":3007},19,[626,3009,2299],{"class":636},[536,3011,3012,3013,3015],{},"A ",[539,3014,567],{"href":470}," 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,3017,281],{"id":3018},"cloudflare-workers",[536,3020,3021,3022,3026,3027,3029],{},"Workers forwards every diagnostics channel message to a ",[539,3023,596],{"href":3024,"rel":3025},"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,3028,600],{},", and their own CPU budget, and the Tail Worker does the shipping, after the response has already gone out:",[617,3031,3034],{"className":619,"code":3032,"filename":3033,"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,3035,3036,3044,3061,3082,3107,3134,3138,3159,3174,3201,3232,3239,3244,3249,3254],{"__ignoreMap":622},[626,3037,3038,3040,3042],{"class":628,"line":629},[626,3039,727],{"class":632},[626,3041,730],{"class":632},[626,3043,749],{"class":636},[626,3045,3046,3049,3052,3054,3057,3059],{"class":628,"line":660},[626,3047,3048],{"class":739},"  async",[626,3050,3051],{"class":760}," tail",[626,3053,736],{"class":636},[626,3055,3056],{"class":1348},"events",[626,3058,1366],{"class":636},[626,3060,749],{"class":636},[626,3062,3063,3066,3068,3070,3072,3075,3078,3080],{"class":628,"line":667},[626,3064,3065],{"class":632},"    for",[626,3067,1345],{"class":760},[626,3069,1197],{"class":739},[626,3071,1610],{"class":640},[626,3073,3074],{"class":636}," of",[626,3076,3077],{"class":640}," events",[626,3079,1780],{"class":760},[626,3081,1913],{"class":636},[626,3083,3084,3087,3089,3091,3094,3096,3098,3100,3103,3105],{"class":628,"line":724},[626,3085,3086],{"class":632},"      for",[626,3088,1345],{"class":760},[626,3090,1197],{"class":739},[626,3092,3093],{"class":640}," messageData",[626,3095,3074],{"class":636},[626,3097,1610],{"class":640},[626,3099,556],{"class":636},[626,3101,3102],{"class":640},"diagnosticsChannelEvents",[626,3104,1780],{"class":760},[626,3106,1913],{"class":636},[626,3108,3109,3112,3114,3117,3119,3121,3123,3125,3127,3129,3131],{"class":628,"line":752},[626,3110,3111],{"class":632},"        if",[626,3113,1345],{"class":760},[626,3115,3116],{"class":640},"messageData",[626,3118,556],{"class":636},[626,3120,1665],{"class":640},[626,3122,2765],{"class":636},[626,3124,650],{"class":636},[626,3126,551],{"class":653},[626,3128,863],{"class":636},[626,3130,1780],{"class":760},[626,3132,3133],{"class":632},"continue\n",[626,3135,3136],{"class":628,"line":763},[626,3137,664],{"emptyLinePlaceholder":663},[626,3139,3140,3143,3146,3148,3150,3153,3155,3157],{"class":628,"line":899},[626,3141,3142],{"class":632},"        await",[626,3144,3145],{"class":673}," fetch",[626,3147,736],{"class":760},[626,3149,863],{"class":636},[626,3151,3152],{"class":653},"https:\u002F\u002Flogs.example.com\u002Fingest",[626,3154,863],{"class":636},[626,3156,818],{"class":636},[626,3158,749],{"class":636},[626,3160,3161,3164,3166,3168,3170,3172],{"class":628,"line":945},[626,3162,3163],{"class":760},"          method",[626,3165,572],{"class":636},[626,3167,650],{"class":636},[626,3169,2121],{"class":653},[626,3171,863],{"class":636},[626,3173,1002],{"class":636},[626,3175,3176,3179,3181,3183,3185,3188,3190,3192,3194,3197,3199],{"class":628,"line":950},[626,3177,3178],{"class":760},"          headers",[626,3180,572],{"class":636},[626,3182,637],{"class":636},[626,3184,650],{"class":636},[626,3186,3187],{"class":760},"Content-Type",[626,3189,863],{"class":636},[626,3191,572],{"class":636},[626,3193,650],{"class":636},[626,3195,3196],{"class":653},"application\u002Fjson",[626,3198,863],{"class":636},[626,3200,2247],{"class":636},[626,3202,3203,3206,3208,3211,3213,3216,3218,3220,3222,3224,3226,3228,3230],{"class":628,"line":958},[626,3204,3205],{"class":760},"          body",[626,3207,572],{"class":636},[626,3209,3210],{"class":640}," JSON",[626,3212,556],{"class":636},[626,3214,3215],{"class":673},"stringify",[626,3217,736],{"class":760},[626,3219,3116],{"class":640},[626,3221,556],{"class":636},[626,3223,1686],{"class":640},[626,3225,556],{"class":636},[626,3227,1855],{"class":640},[626,3229,1366],{"class":760},[626,3231,1002],{"class":636},[626,3233,3234,3237],{"class":628,"line":971},[626,3235,3236],{"class":636},"        }",[626,3238,769],{"class":760},[626,3240,3241],{"class":628,"line":981},[626,3242,3243],{"class":636},"      }\n",[626,3245,3246],{"class":628,"line":990},[626,3247,3248],{"class":636},"    }\n",[626,3250,3251],{"class":628,"line":996},[626,3252,3253],{"class":636},"  },\n",[626,3255,3256],{"class":628,"line":1005},[626,3257,2299],{"class":636},[536,3259,3260,3261,2306,3263,2318,3265,3267,3268,3270,3271,3274,3275,3278],{},"Each entry carries ",[545,3262,2031],{},[545,3264,1665],{},[545,3266,1686],{},", with ",[545,3269,1686],{}," being what evlog published, so the wide event is at ",[545,3272,3273],{},"messageData.message.event",". Requires the ",[545,3276,3277],{},"nodejs_compat"," flag, and messages go through the structured clone algorithm, so only cloneable values survive.",[558,3280,3282],{"id":3281},"when-a-plugin-is-the-better-tool","When a plugin is the better tool",[536,3284,3285,3286,3289],{},"The channel is not a replacement for ",[539,3287,3288],{"href":470},"plugins",". It is narrower on purpose:",[3291,3292,3293,3306],"table",{},[3294,3295,3296],"thead",{},[3297,3298,3299,3303],"tr",{},[3300,3301,3302],"th",{},"You want to…",[3300,3304,3305],{},"Use",[3307,3308,3309,3320,3331,3343,3351],"tbody",{},[3297,3310,3311,3315],{},[3312,3313,3314],"td",{},"Ship events to a backend, with batching and retry",[3312,3316,3317],{},[539,3318,3319],{"href":488},"Custom drain",[3297,3321,3322,3325],{},[3312,3323,3324],{},"Add fields to the event before it drains",[3312,3326,3327,3330],{},[539,3328,3329],{"href":474},"Enricher"," or a plugin",[3297,3332,3333,3336],{},[3312,3334,3335],{},"Fan out to several in-process consumers",[3312,3337,3338,3339,3342],{},"Plugins — ",[545,3340,3341],{},"initLogger({ plugins: [a, b, c] })"," already does this",[3297,3344,3345,3348],{},[3312,3346,3347],{},"Subscribe from a package that must not depend on evlog",[3312,3349,3350],{},"This channel",[3297,3352,3353,3356],{},[3312,3354,3355],{},"Get events out of a Cloudflare Worker without a drain",[3312,3357,3350],{},[536,3359,3360,3363],{},[545,3361,3362],{},"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.",[3365,3366,3367],"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":3369},[3370,3371,3372,3373,3374,3378,3379],{"id":560,"depth":660,"text":561},{"id":611,"depth":660,"text":612},{"id":1556,"depth":660,"text":1557},{"id":2009,"depth":660,"text":2010},{"id":2344,"depth":660,"text":2345,"children":3375},[3376,3377],{"id":2349,"depth":667,"text":2350},{"id":2608,"depth":667,"text":2609},{"id":3018,"depth":660,"text":281},{"id":3281,"depth":660,"text":3282},"Publish every wide event on a node:diagnostics_channel, so a consumer subscribes without importing evlog and Cloudflare can Tail Worker it.","md",[3383,3386],{"label":469,"icon":444,"to":470,"color":3384,"variant":3385},"neutral","subtle",{"label":446,"icon":3387,"to":447,"color":3384,"variant":3385},"i-lucide-radio",{},{"title":456,"icon":449},{"title":531,"description":3380},"PM_r_ol72H5ICP3oIOaP7M4fJ4hrmaZA2UyUkYaX0-A",[3393,3395],{"title":451,"path":452,"stem":453,"description":3394,"icon":454,"children":-1},"Build evlog support for a framework or runtime that has no integration, with defineFrameworkIntegration or the lower-level helpers.",{"title":460,"path":461,"stem":462,"description":3396,"icon":463,"children":-1},"Replay and tail the local NDJSON drain with readFsLogs and tailFsLogs — works in-process or from any external Node tool, survives restarts.",1786799467048]