[{"data":1,"prerenderedAt":1397},["ShallowReactive",2],{"navigation_docs":3,"-libraries-errors":598,"-libraries-errors-surround":1392},[4,35,85,138,318,453,475,534,573],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Start","\u002Fstart","1.start",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",{"title":30,"path":31,"stem":32,"icon":33},"Choose your logger","\u002Fstart\u002Ftypescript-logging-library","1.start\u002F5.typescript-logging-library","i-lucide-file-code",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Learn","\u002Flearn","2.learn",[40,45,50,55,60,65,70,75,80],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":66,"path":67,"stem":68,"icon":69},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":71,"path":72,"stem":73,"icon":74},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":76,"path":77,"stem":78,"icon":79},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":81,"path":82,"stem":83,"icon":84},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":86,"path":87,"stem":88,"children":89,"page":34},"CLI","\u002Fcli","3.cli",[90,93,98,103,108,113,118,123,128,133],{"title":41,"path":91,"stem":92,"icon":49},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":94,"path":95,"stem":96,"icon":97},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":99,"path":100,"stem":101,"icon":102},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":104,"path":105,"stem":106,"icon":107},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":109,"path":110,"stem":111,"icon":112},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":114,"path":115,"stem":116,"icon":117},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":119,"path":120,"stem":121,"icon":122},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":124,"path":125,"stem":126,"icon":127},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":129,"path":130,"stem":131,"icon":132},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":134,"path":135,"stem":136,"icon":137},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":139,"path":140,"stem":141,"children":142,"page":34},"Integrate","\u002Fintegrate","4.integrate",[143,147,230],{"title":41,"path":144,"stem":145,"icon":146},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":148,"path":149,"stem":150,"children":151,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[152,155,185,210],{"title":41,"path":153,"stem":154,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":156,"path":157,"stem":158,"children":159,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[160,165,170,175,180],{"title":161,"path":162,"stem":163,"icon":164},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":166,"path":167,"stem":168,"icon":169},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":171,"path":172,"stem":173,"icon":174},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":176,"path":177,"stem":178,"icon":179},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":181,"path":182,"stem":183,"icon":184},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":186,"path":187,"stem":188,"children":189,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[190,195,200,205],{"title":191,"path":192,"stem":193,"icon":194},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":196,"path":197,"stem":198,"icon":199},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":201,"path":202,"stem":203,"icon":204},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":206,"path":207,"stem":208,"icon":209},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":211,"path":212,"stem":213,"children":214,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[215,220,225],{"title":216,"path":217,"stem":218,"icon":219},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":221,"path":222,"stem":223,"icon":224},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":226,"path":227,"stem":228,"icon":229},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":231,"path":232,"stem":233,"children":234,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[235,239,244,249,254,259,264,269,274,279,284,289,294,299,303,308,313],{"title":41,"path":236,"stem":237,"icon":238},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":240,"path":241,"stem":242,"icon":243},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":245,"path":246,"stem":247,"icon":248},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":250,"path":251,"stem":252,"icon":253},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":255,"path":256,"stem":257,"icon":258},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":260,"path":261,"stem":262,"icon":263},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":265,"path":266,"stem":267,"icon":268},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":270,"path":271,"stem":272,"icon":273},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":275,"path":276,"stem":277,"icon":278},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":280,"path":281,"stem":282,"icon":283},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":285,"path":286,"stem":287,"icon":288},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":290,"path":291,"stem":292,"icon":293},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":295,"path":296,"stem":297,"icon":298},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":300,"path":301,"stem":302,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":304,"path":305,"stem":306,"icon":307},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":309,"path":310,"stem":311,"icon":312},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":314,"path":315,"stem":316,"icon":317},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":319,"path":320,"stem":321,"children":322,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[323,326,331,359,386,418,439,444,449],{"title":41,"path":324,"stem":325,"icon":107},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":327,"path":328,"stem":329,"icon":330},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":332,"icon":333,"path":334,"stem":335,"children":336,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[337,340,345,350,355],{"title":41,"path":338,"stem":339,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":341,"path":342,"stem":343,"icon":344},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":346,"path":347,"stem":348,"icon":349},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":351,"path":352,"stem":353,"icon":354},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":356,"path":357,"stem":358,"icon":137},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":360,"icon":361,"path":362,"stem":363,"children":364,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[365,368,373,378,382],{"title":41,"path":366,"stem":367,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":369,"path":370,"stem":371,"icon":372},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":374,"path":375,"stem":376,"icon":377},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":379,"path":380,"stem":381,"icon":330},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":383,"path":384,"stem":385,"icon":112},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":387,"icon":388,"path":389,"stem":390,"children":391,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[392,395,400,405,410,414],{"title":41,"path":393,"stem":394,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":396,"path":397,"stem":398,"icon":399},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":401,"path":402,"stem":403,"icon":404},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":406,"path":407,"stem":408,"icon":409},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":411,"path":412,"stem":413,"icon":388},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":415,"path":416,"stem":417,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":356,"icon":112,"path":419,"stem":420,"children":421,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[422,425,430,435],{"title":41,"path":423,"stem":424,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":426,"path":427,"stem":428,"icon":429},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":431,"path":432,"stem":433,"icon":434},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":436,"path":437,"stem":438,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":440,"path":441,"stem":442,"icon":443},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":445,"path":446,"stem":447,"icon":448},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":450,"path":451,"stem":452,"icon":434},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":454,"path":455,"stem":456,"children":457,"page":34},"Libraries","\u002Flibraries","6.libraries",[458,462,467,470],{"title":41,"path":459,"stem":460,"icon":461},"\u002Flibraries\u002Foverview","6.libraries\u002F0.overview","i-lucide-package",{"title":463,"path":464,"stem":465,"icon":466},"Emitting Events","\u002Flibraries\u002Femitting","6.libraries\u002F1.emitting","i-lucide-radio",{"title":56,"path":468,"stem":469,"icon":59},"\u002Flibraries\u002Ferrors","6.libraries\u002F2.errors",{"title":471,"path":472,"stem":473,"icon":474},"Testing","\u002Flibraries\u002Ftesting","6.libraries\u002F3.testing","i-lucide-flask-conical",{"title":476,"path":477,"stem":478,"children":479,"page":34},"Extend","\u002Fextend","7.extend",[480,484,489,494,498,503,507,511,515,519,524,529],{"title":41,"path":481,"stem":482,"icon":483},"\u002Fextend\u002Foverview","7.extend\u002F0.overview","i-lucide-blocks",{"title":485,"path":486,"stem":487,"icon":488},"Stream","\u002Fextend\u002Fstream","7.extend\u002F1.stream","i-lucide-radio-tower",{"title":490,"path":491,"stem":492,"icon":493},"Custom framework","\u002Fextend\u002Fcustom-framework","7.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":495,"path":496,"stem":497,"icon":488},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","7.extend\u002F11.diagnostics-channel",{"title":499,"path":500,"stem":501,"icon":502},"FS reader","\u002Fextend\u002Ffs-reader","7.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":415,"path":504,"stem":505,"icon":506},"\u002Fextend\u002Fconsumer-recipes","7.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":508,"path":509,"stem":510,"icon":483},"Plugins","\u002Fextend\u002Fplugins","7.extend\u002F4.plugins",{"title":512,"path":513,"stem":514,"icon":443},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","7.extend\u002F5.custom-enrichers",{"title":516,"path":517,"stem":518,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","7.extend\u002F6.tail-sampling",{"title":520,"path":521,"stem":522,"icon":523},"Identity headers","\u002Fextend\u002Fidentity-headers","7.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":525,"path":526,"stem":527,"icon":528},"Custom drains","\u002Fextend\u002Fcustom-drains","7.extend\u002F8.custom-drains","i-lucide-share-2",{"title":530,"path":531,"stem":532,"icon":533},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","7.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":436,"path":535,"stem":536,"children":537,"page":34},"\u002Freference","8.reference",[538,542,547,550,555,559,564,568],{"title":41,"path":539,"stem":540,"icon":541},"\u002Freference\u002Foverview","8.reference\u002F0.overview","i-lucide-book-marked",{"title":543,"path":544,"stem":545,"icon":546},"Configuration","\u002Freference\u002Fconfiguration","8.reference\u002F1.configuration","i-lucide-settings",{"title":383,"path":548,"stem":549,"icon":112},"\u002Freference\u002Fperformance","8.reference\u002F2.performance",{"title":551,"path":552,"stem":553,"icon":554},"Vite Plugin","\u002Freference\u002Fvite-plugin","8.reference\u002F3.vite-plugin","i-custom-vite",{"title":556,"path":557,"stem":558,"icon":388},"Best Practices","\u002Freference\u002Fbest-practices","8.reference\u002F4.best-practices",{"title":560,"path":561,"stem":562,"icon":563},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","8.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":565,"path":566,"stem":567,"icon":443},"Agent Skills","\u002Freference\u002Fagent-skills","8.reference\u002F6.agent-skills",{"title":569,"path":570,"stem":571,"icon":572},"Cost","\u002Freference\u002Fcost","8.reference\u002F7.cost","i-lucide-receipt",{"title":574,"path":575,"stem":576,"children":577,"page":34},"Compare","\u002Fcompare","9.compare",[578,582,586,590,594],{"title":579,"path":580,"stem":581,"icon":563},"evlog vs Pino","\u002Fcompare\u002Fpino","9.compare\u002F1.pino",{"title":583,"path":584,"stem":585,"icon":204},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","9.compare\u002F2.opentelemetry",{"title":587,"path":588,"stem":589,"icon":563},"evlog vs LogTape","\u002Fcompare\u002Flogtape","9.compare\u002F3.logtape",{"title":591,"path":592,"stem":593,"icon":563},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","9.compare\u002F4.winston",{"title":595,"path":596,"stem":597,"icon":563},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","9.compare\u002F5.consola",{"id":599,"title":56,"body":600,"description":1385,"extension":1386,"links":1387,"meta":1388,"navigation":1389,"path":468,"seo":1390,"stem":469,"__hash__":1391},"docs\u002F6.libraries\u002F2.errors.md",{"type":601,"value":602,"toc":1379},"minimark",[603,612,625,630,636,935,967,994,998,1005,1138,1160,1178,1182,1188,1296,1307,1310,1362,1366,1375],[604,605,606,607,611],"p",{},"The errors your package throws cross a boundary: the host catches them, serializes them, and decides what the user sees. A bare ",[608,609,610],"code",{},"Error"," gives the host nothing to work with, so the response comes back as an opaque 500, the support ticket starts with \"something failed\", and the dashboard chart counting your failures does not exist. A catalog replaces that negotiation with data.",[613,614,617,620,621,624],"callout",{"color":615,"icon":616},"warning","i-lucide-alert-triangle",[608,618,619],{},"initLogger()"," belongs to the host application. Nothing on this page touches configuration: a catalog is a module of error factories, and throwing one is what makes the host's pipeline useful. ",[622,623,463],"a",{"href":464}," covers the configuration boundary.",[626,627,629],"h2",{"id":628},"define-a-catalog-with-a-prefix-your-package-owns","Define a catalog with a prefix your package owns",[604,631,632,635],{},[608,633,634],{},"defineErrorCatalog"," builds one factory per entry. The prefix is the first half of the wire format, so give it your package name:",[637,638,644],"pre",{"className":639,"code":640,"filename":641,"language":642,"meta":643,"style":643},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineErrorCatalog } from 'evlog'\n\nexport const errors = defineErrorCatalog('mylib', {\n  RATE_LIMITED: {\n    status: 429,\n    message: 'Too many requests',\n    why: 'The upstream provider returned HTTP 429',\n    fix: 'Retry with exponential backoff',\n    link: 'https:\u002F\u002Fmylib.dev\u002Ferrors\u002Frate-limited',\n  },\n  INSUFFICIENT_FUNDS: {\n    status: 402,\n    message: ({ available, required }: { available: number, required: number }) =>\n      `Insufficient funds: $${available}\u002F$${required}`,\n  },\n})\n","src\u002Ferrors.ts","typescript","",[608,645,646,679,686,722,734,749,766,783,800,817,823,833,845,891,922,927],{"__ignoreMap":643},[647,648,651,655,659,663,666,669,672,676],"span",{"class":649,"line":650},"line",1,[647,652,654],{"class":653},"s7zQu","import",[647,656,658],{"class":657},"sMK4o"," {",[647,660,662],{"class":661},"sTEyZ"," defineErrorCatalog",[647,664,665],{"class":657}," }",[647,667,668],{"class":653}," from",[647,670,671],{"class":657}," '",[647,673,675],{"class":674},"sfazB","evlog",[647,677,678],{"class":657},"'\n",[647,680,682],{"class":649,"line":681},2,[647,683,685],{"emptyLinePlaceholder":684},true,"\n",[647,687,689,692,696,699,702,705,708,711,714,716,719],{"class":649,"line":688},3,[647,690,691],{"class":653},"export",[647,693,695],{"class":694},"spNyl"," const",[647,697,698],{"class":661}," errors ",[647,700,701],{"class":657},"=",[647,703,662],{"class":704},"s2Zo4",[647,706,707],{"class":661},"(",[647,709,710],{"class":657},"'",[647,712,713],{"class":674},"mylib",[647,715,710],{"class":657},[647,717,718],{"class":657},",",[647,720,721],{"class":657}," {\n",[647,723,725,729,732],{"class":649,"line":724},4,[647,726,728],{"class":727},"swJcz","  RATE_LIMITED",[647,730,731],{"class":657},":",[647,733,721],{"class":657},[647,735,737,740,742,746],{"class":649,"line":736},5,[647,738,739],{"class":727},"    status",[647,741,731],{"class":657},[647,743,745],{"class":744},"sbssI"," 429",[647,747,748],{"class":657},",\n",[647,750,752,755,757,759,762,764],{"class":649,"line":751},6,[647,753,754],{"class":727},"    message",[647,756,731],{"class":657},[647,758,671],{"class":657},[647,760,761],{"class":674},"Too many requests",[647,763,710],{"class":657},[647,765,748],{"class":657},[647,767,769,772,774,776,779,781],{"class":649,"line":768},7,[647,770,771],{"class":727},"    why",[647,773,731],{"class":657},[647,775,671],{"class":657},[647,777,778],{"class":674},"The upstream provider returned HTTP 429",[647,780,710],{"class":657},[647,782,748],{"class":657},[647,784,786,789,791,793,796,798],{"class":649,"line":785},8,[647,787,788],{"class":727},"    fix",[647,790,731],{"class":657},[647,792,671],{"class":657},[647,794,795],{"class":674},"Retry with exponential backoff",[647,797,710],{"class":657},[647,799,748],{"class":657},[647,801,803,806,808,810,813,815],{"class":649,"line":802},9,[647,804,805],{"class":727},"    link",[647,807,731],{"class":657},[647,809,671],{"class":657},[647,811,812],{"class":674},"https:\u002F\u002Fmylib.dev\u002Ferrors\u002Frate-limited",[647,814,710],{"class":657},[647,816,748],{"class":657},[647,818,820],{"class":649,"line":819},10,[647,821,822],{"class":657},"  },\n",[647,824,826,829,831],{"class":649,"line":825},11,[647,827,828],{"class":727},"  INSUFFICIENT_FUNDS",[647,830,731],{"class":657},[647,832,721],{"class":657},[647,834,836,838,840,843],{"class":649,"line":835},12,[647,837,739],{"class":727},[647,839,731],{"class":657},[647,841,842],{"class":744}," 402",[647,844,748],{"class":657},[647,846,848,850,852,855,859,861,864,867,869,871,873,877,879,881,883,885,888],{"class":649,"line":847},13,[647,849,754],{"class":704},[647,851,731],{"class":657},[647,853,854],{"class":657}," ({",[647,856,858],{"class":857},"sHdIc"," available",[647,860,718],{"class":657},[647,862,863],{"class":857}," required",[647,865,866],{"class":657}," }:",[647,868,658],{"class":657},[647,870,858],{"class":727},[647,872,731],{"class":657},[647,874,876],{"class":875},"sBMFI"," number",[647,878,718],{"class":657},[647,880,863],{"class":727},[647,882,731],{"class":657},[647,884,876],{"class":875},[647,886,887],{"class":657}," })",[647,889,890],{"class":694}," =>\n",[647,892,894,897,900,903,906,909,912,914,917,920],{"class":649,"line":893},14,[647,895,896],{"class":657},"      `",[647,898,899],{"class":674},"Insufficient funds: $",[647,901,902],{"class":657},"${",[647,904,905],{"class":661},"available",[647,907,908],{"class":657},"}",[647,910,911],{"class":674},"\u002F$",[647,913,902],{"class":657},[647,915,916],{"class":661},"required",[647,918,919],{"class":657},"}`",[647,921,748],{"class":657},[647,923,925],{"class":649,"line":924},15,[647,926,822],{"class":657},[647,928,930,932],{"class":649,"line":929},16,[647,931,908],{"class":657},[647,933,934],{"class":661},")\n",[604,936,937,938,941,942,945,946,949,950,949,953,949,956,959,960,963,964,966],{},"Each entry accepts: ",[608,939,940],{},"status"," (default 500), ",[608,943,944],{},"message"," as a constant string or a typed function whose params become required factory arguments, ",[608,947,948],{},"why",", ",[608,951,952],{},"fix",[608,954,955],{},"link",[608,957,958],{},"tags",", and ",[608,961,962],{},"internal"," for backend-only context. The ",[622,965,56],{"href":57}," page documents the full anatomy as an application sees it.",[604,968,969,970,973,974,977,978,980,981,984,985,949,987,949,989,959,991,993],{},"The wire format is ",[608,971,972],{},"${prefix}.${KEY}",": throw ",[608,975,976],{},"errors.RATE_LIMITED()"," and the host receives an error whose ",[608,979,608],{}," is ",[608,982,983],{},"mylib.RATE_LIMITED",", with ",[608,986,940],{},[608,988,944],{},[608,990,948],{},[608,992,952],{}," attached. One prefix per package is what keeps a graph coherent: a host running several evlog-instrumented packages never sees two codes collide, because each package owns one namespace, the way each package owns one npm name.",[626,995,997],{"id":996},"throw-and-let-the-host-route-it","Throw and let the host route it",[604,999,1000,1001,1004],{},"The factory returns an ",[608,1002,1003],{},"EvlogError",". Throwing it is the whole integration:",[637,1006,1009],{"className":639,"code":1007,"filename":1008,"language":642,"meta":643,"style":643},"import { errors } from '.\u002Ferrors'\n\nexport function charge(amount: number): void {\n  if (amount \u003C= 0) {\n    throw errors.INSUFFICIENT_FUNDS({ available: amount, required: 1 })\n  }\n  \u002F\u002F ...\n}\n","src\u002Fbilling.ts",[608,1010,1011,1031,1035,1062,1084,1122,1127,1133],{"__ignoreMap":643},[647,1012,1013,1015,1017,1020,1022,1024,1026,1029],{"class":649,"line":650},[647,1014,654],{"class":653},[647,1016,658],{"class":657},[647,1018,1019],{"class":661}," errors",[647,1021,665],{"class":657},[647,1023,668],{"class":653},[647,1025,671],{"class":657},[647,1027,1028],{"class":674},".\u002Ferrors",[647,1030,678],{"class":657},[647,1032,1033],{"class":649,"line":681},[647,1034,685],{"emptyLinePlaceholder":684},[647,1036,1037,1039,1042,1045,1047,1050,1052,1054,1057,1060],{"class":649,"line":688},[647,1038,691],{"class":653},[647,1040,1041],{"class":694}," function",[647,1043,1044],{"class":704}," charge",[647,1046,707],{"class":657},[647,1048,1049],{"class":857},"amount",[647,1051,731],{"class":657},[647,1053,876],{"class":875},[647,1055,1056],{"class":657},"):",[647,1058,1059],{"class":875}," void",[647,1061,721],{"class":657},[647,1063,1064,1067,1070,1072,1075,1078,1081],{"class":649,"line":724},[647,1065,1066],{"class":653},"  if",[647,1068,1069],{"class":727}," (",[647,1071,1049],{"class":661},[647,1073,1074],{"class":657}," \u003C=",[647,1076,1077],{"class":744}," 0",[647,1079,1080],{"class":727},") ",[647,1082,1083],{"class":657},"{\n",[647,1085,1086,1089,1091,1094,1097,1099,1102,1104,1106,1109,1111,1113,1115,1118,1120],{"class":649,"line":736},[647,1087,1088],{"class":653},"    throw",[647,1090,1019],{"class":661},[647,1092,1093],{"class":657},".",[647,1095,1096],{"class":704},"INSUFFICIENT_FUNDS",[647,1098,707],{"class":727},[647,1100,1101],{"class":657},"{",[647,1103,858],{"class":727},[647,1105,731],{"class":657},[647,1107,1108],{"class":661}," amount",[647,1110,718],{"class":657},[647,1112,863],{"class":727},[647,1114,731],{"class":657},[647,1116,1117],{"class":744}," 1",[647,1119,665],{"class":657},[647,1121,934],{"class":727},[647,1123,1124],{"class":649,"line":751},[647,1125,1126],{"class":657},"  }\n",[647,1128,1129],{"class":649,"line":768},[647,1130,1132],{"class":1131},"sHwdD","  \u002F\u002F ...\n",[647,1134,1135],{"class":649,"line":785},[647,1136,1137],{"class":657},"}\n",[604,1139,1140,1141,1143,1144,1146,1147,1149,1150,1152,1153,1155,1156,1159],{},"What the host gets: a ",[608,1142,940],{}," it can put on the HTTP response, a ",[608,1145,608],{}," its drain can index, and ",[608,1148,948],{},"\u002F",[608,1151,952],{}," it can show. ",[608,1154,962],{}," stays backend-only: it is omitted from ",[608,1157,1158],{},"JSON.stringify(error)"," and from every framework serializer, so it is the right place for context you would not send to a client.",[604,1161,1162,1163,1166,1167,1170,1171,1173,1174,1177],{},"Hosts should catch with ",[608,1164,1165],{},"EvlogError.isEvlogError(error)"," rather than ",[608,1168,1169],{},"instanceof",". Package managers routinely install more than one physical copy of evlog, and ",[608,1172,1169],{}," silently reports ",[608,1175,1176],{},"false"," across copies, which downgrades your structured error to a bare 500. The brand check works across copies. Document this in your package's error handling guide if you document throwing behavior.",[626,1179,1181],{"id":1180},"publish-the-catalog-as-its-own-entrypoint","Publish the catalog as its own entrypoint",[604,1183,1184,1185,1187],{},"Put the catalog in ",[608,1186,641],{}," and export it under its own subpath, so hosts can import your codes without pulling the rest of the package:",[637,1189,1194],{"className":1190,"code":1191,"filename":1192,"language":1193,"meta":643,"style":643},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"exports\": {\n    \".\": \".\u002Fdist\u002Findex.mjs\",\n    \".\u002Ferrors\": \".\u002Fdist\u002Ferrors.mjs\"\n  },\n  \"peerDependencies\": {\n    \"evlog\": \"^2.0.0\"\n  }\n}\n","package.json","json",[608,1195,1196,1200,1215,1236,1254,1258,1271,1288,1292],{"__ignoreMap":643},[647,1197,1198],{"class":649,"line":650},[647,1199,1083],{"class":657},[647,1201,1202,1205,1208,1211,1213],{"class":649,"line":681},[647,1203,1204],{"class":657},"  \"",[647,1206,1207],{"class":694},"exports",[647,1209,1210],{"class":657},"\"",[647,1212,731],{"class":657},[647,1214,721],{"class":657},[647,1216,1217,1220,1222,1224,1226,1229,1232,1234],{"class":649,"line":688},[647,1218,1219],{"class":657},"    \"",[647,1221,1093],{"class":875},[647,1223,1210],{"class":657},[647,1225,731],{"class":657},[647,1227,1228],{"class":657}," \"",[647,1230,1231],{"class":674},".\u002Fdist\u002Findex.mjs",[647,1233,1210],{"class":657},[647,1235,748],{"class":657},[647,1237,1238,1240,1242,1244,1246,1248,1251],{"class":649,"line":724},[647,1239,1219],{"class":657},[647,1241,1028],{"class":875},[647,1243,1210],{"class":657},[647,1245,731],{"class":657},[647,1247,1228],{"class":657},[647,1249,1250],{"class":674},".\u002Fdist\u002Ferrors.mjs",[647,1252,1253],{"class":657},"\"\n",[647,1255,1256],{"class":649,"line":736},[647,1257,822],{"class":657},[647,1259,1260,1262,1265,1267,1269],{"class":649,"line":751},[647,1261,1204],{"class":657},[647,1263,1264],{"class":694},"peerDependencies",[647,1266,1210],{"class":657},[647,1268,731],{"class":657},[647,1270,721],{"class":657},[647,1272,1273,1275,1277,1279,1281,1283,1286],{"class":649,"line":768},[647,1274,1219],{"class":657},[647,1276,675],{"class":875},[647,1278,1210],{"class":657},[647,1280,731],{"class":657},[647,1282,1228],{"class":657},[647,1284,1285],{"class":674},"^2.0.0",[647,1287,1253],{"class":657},[647,1289,1290],{"class":649,"line":785},[647,1291,1126],{"class":657},[647,1293,1294],{"class":649,"line":802},[647,1295,1137],{"class":657},[604,1297,1298,1300,1301,1303,1304,1306],{},[608,1299,675],{}," stays a peer dependency: the catalog factories build ",[608,1302,1003],{}," instances from whatever copy of evlog the host resolved, so your errors and the host's share one type. If your package is large enough to need several catalogs, the npm packaging recipe on ",[622,1305,81],{"href":82}," covers splitting them per bounded context.",[604,1308,1309],{},"Register the catalog in your package's type surface so your consumers get autocomplete on the codes:",[637,1311,1313],{"className":639,"code":1312,"filename":641,"language":642,"meta":643,"style":643},"declare module 'evlog' {\n  interface RegisteredErrorCatalogs {\n    mylib: typeof errors\n  }\n}\n",[608,1314,1315,1331,1341,1354,1358],{"__ignoreMap":643},[647,1316,1317,1320,1323,1325,1327,1329],{"class":649,"line":650},[647,1318,1319],{"class":694},"declare",[647,1321,1322],{"class":694}," module",[647,1324,671],{"class":657},[647,1326,675],{"class":674},[647,1328,710],{"class":657},[647,1330,721],{"class":657},[647,1332,1333,1336,1339],{"class":649,"line":681},[647,1334,1335],{"class":694},"  interface",[647,1337,1338],{"class":875}," RegisteredErrorCatalogs",[647,1340,721],{"class":657},[647,1342,1343,1346,1348,1351],{"class":649,"line":688},[647,1344,1345],{"class":727},"    mylib",[647,1347,731],{"class":657},[647,1349,1350],{"class":657}," typeof",[647,1352,1353],{"class":661}," errors\n",[647,1355,1356],{"class":649,"line":724},[647,1357,1126],{"class":657},[647,1359,1360],{"class":649,"line":736},[647,1361,1137],{"class":657},[626,1363,1365],{"id":1364},"treat-error-codes-as-wire-format","Treat error codes as wire format",[604,1367,1368,1369,1371,1372,1374],{},"The code string crosses your package boundary and lands in the host's dashboards, alerts, and support macros. Renaming a code is a breaking change, the same way renaming an exported function is: anyone matching on ",[608,1370,983],{}," breaks. Add codes freely, reorder entries safely, and when a code must go, deprecate before you remove it. ",[622,1373,471],{"href":472}," shows how to make a rename fail in your own test suite before it fails in a host.",[1376,1377,1378],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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}",{"title":643,"searchDepth":681,"depth":681,"links":1380},[1381,1382,1383,1384],{"id":628,"depth":681,"text":629},{"id":996,"depth":681,"text":997},{"id":1180,"depth":681,"text":1181},{"id":1364,"depth":681,"text":1365},"Replace bare errors with a catalog your package owns: typed factories, a collision-free wire format, and codes the host can act on.","md",null,{},{"title":56,"icon":59},{"title":56,"description":1385},"IAgyGRxQYDcR6m7RIiEKy2WFSfdPRFkWJpb_Sj--p0Y",[1393,1395],{"title":463,"path":464,"stem":465,"description":1394,"icon":466,"children":-1},"Emit events from library code the host can attribute and filter: the global log API, source fields, request participation, and duplicate installs.",{"title":471,"path":472,"stem":473,"description":1396,"icon":474,"children":-1},"Test the events your package emits and the errors it throws: a collecting drain, the memory drain, and factory codes that fail on rename.",1789076918228]