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