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