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