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