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