[{"data":1,"prerenderedAt":3774},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-vs-other-loggers":547,"-getting-started-vs-other-loggers-surround":3769},[4,35,159,201,289,446,531],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Build on top","\u002Fbuild-on-top","5.build-on-top",[294,297,325,346,373,400,428],{"title":41,"path":295,"stem":296,"icon":54},"\u002Fbuild-on-top\u002Foverview","5.build-on-top\u002F0.overview",{"title":298,"path":299,"stem":300,"children":301,"page":34},"Observers","\u002Fbuild-on-top\u002Fobservers","5.build-on-top\u002Fobservers",[302,306,311,316,321],{"title":41,"path":303,"stem":304,"icon":305},"\u002Fbuild-on-top\u002Fobservers\u002Foverview","5.build-on-top\u002Fobservers\u002F1.overview","i-lucide-eye",{"title":307,"path":308,"stem":309,"icon":310},"Stream API","\u002Fbuild-on-top\u002Fobservers\u002Fin-process-stream","5.build-on-top\u002Fobservers\u002F2.in-process-stream","i-lucide-radio-tower",{"title":312,"path":313,"stem":314,"icon":315},"Stream server","\u002Fbuild-on-top\u002Fobservers\u002Fstream-server","5.build-on-top\u002Fobservers\u002F3.stream-server","i-lucide-radio",{"title":317,"path":318,"stem":319,"icon":320},"FS reader","\u002Fbuild-on-top\u002Fobservers\u002Ffs-reader","5.build-on-top\u002Fobservers\u002F4.fs-reader","i-lucide-folder-search",{"title":156,"path":322,"stem":323,"icon":324},"\u002Fbuild-on-top\u002Fobservers\u002Fconsumer-recipes","5.build-on-top\u002Fobservers\u002F5.consumer-recipes","i-lucide-chef-hat",{"title":326,"path":327,"stem":328,"children":329,"page":34},"Pipeline","\u002Fbuild-on-top\u002Fpipeline","5.build-on-top\u002Fpipeline",[330,334,338,342],{"title":41,"path":331,"stem":332,"icon":333},"\u002Fbuild-on-top\u002Fpipeline\u002Foverview","5.build-on-top\u002Fpipeline\u002F1.overview","i-lucide-workflow",{"title":335,"path":336,"stem":337,"icon":288},"Plugins","\u002Fbuild-on-top\u002Fpipeline\u002Fplugins","5.build-on-top\u002Fpipeline\u002F2.plugins",{"title":339,"path":340,"stem":341,"icon":28},"Custom enrichers","\u002Fbuild-on-top\u002Fpipeline\u002Fcustom-enrichers","5.build-on-top\u002Fpipeline\u002F3.custom-enrichers",{"title":343,"path":344,"stem":345,"icon":178},"Tail sampling","\u002Fbuild-on-top\u002Fpipeline\u002Ftail-sampling","5.build-on-top\u002Fpipeline\u002F4.tail-sampling",{"title":347,"path":348,"stem":349,"children":350,"page":34},"Scenarios","\u002Fbuild-on-top\u002Fscenarios","5.build-on-top\u002Fscenarios",[351,355,359,364,368],{"title":41,"path":352,"stem":353,"icon":354},"\u002Fbuild-on-top\u002Fscenarios\u002Foverview","5.build-on-top\u002Fscenarios\u002F0.overview","i-lucide-clipboard-list",{"title":356,"path":357,"stem":358,"icon":49},"Local debugging toolkit","\u002Fbuild-on-top\u002Fscenarios\u002Flocal-debugging-toolkit","5.build-on-top\u002Fscenarios\u002F1.local-debugging-toolkit",{"title":360,"path":361,"stem":362,"icon":363},"Tenant-aware logging","\u002Fbuild-on-top\u002Fscenarios\u002Ftenant-aware-logging","5.build-on-top\u002Fscenarios\u002F2.tenant-aware-logging","i-lucide-users",{"title":365,"path":366,"stem":367,"icon":129},"Compliance audit","\u002Fbuild-on-top\u002Fscenarios\u002Fcompliance-audit","5.build-on-top\u002Fscenarios\u002F3.compliance-audit",{"title":369,"path":370,"stem":371,"icon":372},"Cross-app error vocab","\u002Fbuild-on-top\u002Fscenarios\u002Fcross-app-error-vocab","5.build-on-top\u002Fscenarios\u002F4.cross-app-error-vocab","i-lucide-book",{"title":374,"path":375,"stem":376,"children":377,"page":34},"Shared packages","\u002Fbuild-on-top\u002Fshared","5.build-on-top\u002Fshared",[378,382,386,391,395],{"title":41,"path":379,"stem":380,"icon":381},"\u002Fbuild-on-top\u002Fshared\u002Foverview","5.build-on-top\u002Fshared\u002F1.overview","i-lucide-package",{"title":383,"path":384,"stem":385,"icon":381},"Catalogs as packages","\u002Fbuild-on-top\u002Fshared\u002Fcatalogs-as-packages","5.build-on-top\u002Fshared\u002F2.catalogs-as-packages",{"title":387,"path":388,"stem":389,"icon":390},"Drains as packages","\u002Fbuild-on-top\u002Fshared\u002Fdrains-as-packages","5.build-on-top\u002Fshared\u002F3.drains-as-packages","i-lucide-package-2",{"title":392,"path":393,"stem":394,"icon":28},"Enrichers as packages","\u002Fbuild-on-top\u002Fshared\u002Fenrichers-as-packages","5.build-on-top\u002Fshared\u002F4.enrichers-as-packages",{"title":396,"path":397,"stem":398,"icon":399},"Integration as package","\u002Fbuild-on-top\u002Fshared\u002Fintegration-as-package","5.build-on-top\u002Fshared\u002F5.integration-as-package","i-lucide-package-check",{"title":401,"path":402,"stem":403,"children":404,"page":34},"Sinks","\u002Fbuild-on-top\u002Fsinks","5.build-on-top\u002Fsinks",[405,409,414,418,423],{"title":41,"path":406,"stem":407,"icon":408},"\u002Fbuild-on-top\u002Fsinks\u002Foverview","5.build-on-top\u002Fsinks\u002F1.overview","i-lucide-arrow-up-from-line",{"title":410,"path":411,"stem":412,"icon":413},"Custom drains","\u002Fbuild-on-top\u002Fsinks\u002Fcustom-drains","5.build-on-top\u002Fsinks\u002F2.custom-drains","i-lucide-code-2",{"title":415,"path":416,"stem":417,"icon":333},"Drain pipeline","\u002Fbuild-on-top\u002Fsinks\u002Fdrain-pipeline","5.build-on-top\u002Fsinks\u002F3.drain-pipeline",{"title":419,"path":420,"stem":421,"icon":422},"Identity headers","\u002Fbuild-on-top\u002Fsinks\u002Fidentity-headers","5.build-on-top\u002Fsinks\u002F4.identity-headers","i-lucide-fingerprint",{"title":424,"path":425,"stem":426,"icon":427},"Fanout","\u002Fbuild-on-top\u002Fsinks\u002Ffanout-and-multi-drain","5.build-on-top\u002Fsinks\u002F5.fanout-and-multi-drain","i-lucide-share-2",{"title":429,"path":430,"stem":431,"children":432,"page":34},"Sources","\u002Fbuild-on-top\u002Fsources","5.build-on-top\u002Fsources",[433,437,441],{"title":41,"path":434,"stem":435,"icon":436},"\u002Fbuild-on-top\u002Fsources\u002Foverview","5.build-on-top\u002Fsources\u002F1.overview","i-lucide-arrow-down-to-line",{"title":438,"path":439,"stem":440,"icon":288},"Custom framework","\u002Fbuild-on-top\u002Fsources\u002Fcustom-framework","5.build-on-top\u002Fsources\u002F2.custom-framework",{"title":442,"path":443,"stem":444,"icon":445},"Middleware toolkit","\u002Fbuild-on-top\u002Fsources\u002Fmiddleware-toolkit","5.build-on-top\u002Fsources\u002F3.middleware-toolkit","i-lucide-wrench",{"title":447,"path":448,"stem":449,"children":450,"page":34},"Adapters","\u002Fadapters","6.adapters",[451,454,494,509],{"title":41,"path":452,"stem":453,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":455,"path":456,"stem":457,"children":458,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[459,464,469,474,479,484,489],{"title":460,"path":461,"stem":462,"icon":463},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":465,"path":466,"stem":467,"icon":468},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":470,"path":471,"stem":472,"icon":473},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":475,"path":476,"stem":477,"icon":478},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":480,"path":481,"stem":482,"icon":483},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":485,"path":486,"stem":487,"icon":488},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":490,"path":491,"stem":492,"icon":493},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":495,"path":496,"stem":497,"children":498,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[499,504],{"title":500,"path":501,"stem":502,"icon":503},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":505,"path":506,"stem":507,"icon":508},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":510,"path":511,"stem":512,"children":513,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[514,517,522,526],{"title":326,"path":515,"stem":516,"icon":333},"\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline",{"title":518,"path":519,"stem":520,"icon":521},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":523,"path":524,"stem":525,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":527,"path":528,"stem":529,"icon":530},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":532,"path":533,"stem":534,"children":535,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[536,539,543],{"title":41,"path":537,"stem":538,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":540,"path":541,"stem":542,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":544,"path":545,"stem":546,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":548,"title":549,"body":550,"description":3758,"extension":3759,"links":3760,"meta":3765,"navigation":3766,"path":31,"seo":3767,"stem":32,"__hash__":3768},"docs\u002F1.getting-started\u002F5.vs-other-loggers.md","evlog vs pino, winston, consola",{"type":551,"value":552,"toc":3737},"minimark",[553,570,575,627,631,638,647,652,929,933,1216,1220,1409,1429,1445,1449,1452,1459,1469,1601,1612,1619,1641,1645,1677,1683,1694,1698,1714,1718,1729,3212,3215,3622,3625,3672,3676,3679,3702,3706,3733],[554,555,556,557,561,562,565,566,569],"p",{},"evlog is a fully-featured general-purpose logger first, with wide events as a native extension of the same API. This page compares it head-to-head with the three loggers TypeScript developers usually consider — ",[558,559,560],"strong",{},"pino",", ",[558,563,564],{},"winston",", and ",[558,567,568],{},"consola"," — so you know exactly what you gain, what stays the same, and what (if anything) is missing today.",[571,572,574],"h2",{"id":573},"tldr","TL;DR",[576,577,578,596,607,613],"ul",{},[579,580,581,584,585,588,589,588,592,595],"li",{},[558,582,583],{},"Pick evlog over pino"," if you want the same throughput class with structured errors, redaction, and wide events built in — and you don't want to assemble ",[586,587,560],"code",{}," + ",[586,590,591],{},"pino-pretty",[586,593,594],{},"pino-http"," + custom transports yourself.",[579,597,598,601,602,606],{},[558,599,600],{},"Pick evlog over winston"," in any new TypeScript project. winston is older, slower (see ",[603,604,605],"a",{"href":189},"benchmarks","), and ships none of the modern features (typed events, redaction, structured errors, AI SDK integration).",[579,608,609,612],{},[558,610,611],{},"Pick evlog over consola"," as soon as your code leaves a CLI. consola is great for terminal pretty-printing but doesn't ship a drain pipeline, sampling, or wide events.",[579,614,615,618,619,622,623,626],{},[558,616,617],{},"Stay on pino"," only if you're on an extremely hot path that emits hundreds of thousands of fire-and-forget log lines per second to ",[586,620,621],{},"\u002Fdev\u002Fnull"," and you have a custom transport you don't want to port. evlog still wins the wide event lifecycle by 7.7x, but pino can edge it on raw ",[586,624,625],{},"info('hello world')"," throughput.",[571,628,630],{"id":629},"feature-comparison","Feature comparison",[554,632,633,634,637],{},"Three tables instead of one wall. The ",[558,635,636],{},"Winner"," column on the right tells you who wins each row at a glance; cells use semantic words (\"Built-in\", \"Manual\", \"via X\") instead of generic \"Yes\" so you can read the level of effort without reading the spec.",[639,640,642,643,646],"callout",{"color":641,"icon":13},"info","Hover (or tap on mobile) the ",[558,644,645],{},"info icon"," next to any feature name for a one-line explanation of what the row actually compares.",[648,649,651],"h3",{"id":650},"core-api","Core API",[653,654,655,678],"table",{},[656,657,658],"thead",{},[659,660,661,665,669,671,673,675],"tr",{},[662,663,664],"th",{},"Feature",[662,666,668],{"align":667},"center","evlog",[662,670,560],{"align":667},[662,672,568],{"align":667},[662,674,564],{"align":667},[662,676,636],{"align":677},"left",[679,680,681,703,725,747,765,788,808,828,848,868,889,909],"tbody",{},[659,682,683,691,694,696,698,700],{},[684,685,686],"td",{},[687,688,690],"feature-label",{"tip":689},"The four classic severities (debug \u002F info \u002F warn \u002F error) every logger ships, used for severity-based filtering.","Standard levels",[684,692,693],{"align":667},"Yes",[684,695,693],{"align":667},[684,697,693],{"align":667},[684,699,693],{"align":667},[684,701,702],{"align":677},"All",[659,704,705,711,714,716,718,720],{},[684,706,707],{},[687,708,710],{"tip":709},"Define extra severities like trace, notice, or fatal beyond the standard four — handy when migrating from a pipeline that depends on them.","Custom levels",[684,712,713],{"align":667},"No",[684,715,693],{"align":667},[684,717,693],{"align":667},[684,719,693],{"align":667},[684,721,722],{"align":677},[558,723,724],{},"pino, consola, winston",[659,726,727,733,735,737,740,742],{},[684,728,729],{},[687,730,732],{"tip":731},"Pass typed key\u002Fvalue objects on every log call instead of stuffing data into the message string. Required for queryable logs.","Structured fields per call",[684,734,693],{"align":667},[684,736,693],{"align":667},[684,738,739],{"align":667},"Partial",[684,741,693],{"align":667},[684,743,744],{"align":677},[558,745,746],{},"evlog, pino, winston",[659,748,749,755,757,759,761,763],{},[684,750,751],{},[687,752,754],{"tip":753},"Create a logger that inherits parent bindings (e.g. requestId, component) and auto-attaches them to every subsequent call.","Child loggers \u002F persistent bindings",[684,756,693],{"align":667},[684,758,693],{"align":667},[684,760,693],{"align":667},[684,762,693],{"align":667},[684,764,702],{"align":677},[659,766,767,773,775,778,780,783],{},[684,768,769],{},[687,770,772],{"tip":771},"Human-readable colored output during development, machine-parseable JSON in production. Switched automatically based on NODE_ENV.","Pretty in dev \u002F JSON in prod (auto)",[684,774,540],{"align":667},[684,776,777],{"align":667},"via pino-pretty",[684,779,540],{"align":667},[684,781,782],{"align":667},"Manual",[684,784,785],{"align":677},[558,786,787],{},"evlog, consola",[659,789,790,796,798,800,802,804],{},[684,791,792],{},[687,793,795],{"tip":794},"A separate runtime for the browser that strips Node.js APIs (process, fs) and ships a small bundle for client-side logging.","Browser-safe build",[684,797,693],{"align":667},[684,799,713],{"align":667},[684,801,693],{"align":667},[684,803,713],{"align":667},[684,805,806],{"align":677},[558,807,787],{},[659,809,810,816,818,820,822,824],{},[684,811,812],{},[687,813,815],{"tip":814},"Spin off a child wide event from the parent — used for batched operations or per-item processing inside one request, without losing correlation.","Sub-operation logger (log.fork)",[684,817,693],{"align":667},[684,819,713],{"align":667},[684,821,713],{"align":667},[684,823,713],{"align":667},[684,825,826],{"align":677},[558,827,668],{},[659,829,830,836,838,840,842,844],{},[684,831,832],{},[687,833,835],{"tip":834},"Every event carries a source field (server or client) automatically so you can split client-side errors from server-side ones in your dashboard.","Source distinction (server \u002F client)",[684,837,693],{"align":667},[684,839,713],{"align":667},[684,841,713],{"align":667},[684,843,713],{"align":667},[684,845,846],{"align":677},[558,847,668],{},[659,849,850,856,858,860,862,864],{},[684,851,852],{},[687,853,855],{"tip":854},"Toggle log levels on the fly (e.g. logger.level = 'debug') without a restart — useful for --verbose flags or hot-reload.","Runtime level mutation",[684,857,713],{"align":667},[684,859,693],{"align":667},[684,861,693],{"align":667},[684,863,693],{"align":667},[684,865,866],{"align":677},[558,867,724],{},[659,869,870,876,878,880,882,884],{},[684,871,872],{},[687,873,875],{"tip":874},"Pluggable transformers that turn typed objects (errors, requests, responses) into JSON. evlog handles common cases via redaction + createError instead of plugins.","Plugin \u002F serializer system",[684,877,713],{"align":667},[684,879,693],{"align":667},[684,881,713],{"align":667},[684,883,693],{"align":667},[684,885,886],{"align":677},[558,887,888],{},"pino, winston",[659,890,891,897,899,901,903,905],{},[684,892,893],{},[687,894,896],{"tip":895},"Accumulate context throughout a request and emit one typed event at the end — the wide-event observability pattern from Honeycomb \u002F Charity Majors.","Wide events (one per operation)",[684,898,693],{"align":667},[684,900,713],{"align":667},[684,902,713],{"align":667},[684,904,713],{"align":667},[684,906,907],{"align":677},[558,908,668],{},[659,910,911,917,919,921,923,925],{},[684,912,913],{},[687,914,916],{"tip":915},"Errors carry why (root cause), fix (actionable next step), and link (docs URL) fields that travel from server to client.","Structured errors (why \u002F fix \u002F link)",[684,918,693],{"align":667},[684,920,713],{"align":667},[684,922,713],{"align":667},[684,924,713],{"align":667},[684,926,927],{"align":677},[558,928,668],{},[648,930,932],{"id":931},"production-features","Production features",[653,934,935,951],{},[656,936,937],{},[659,938,939,941,943,945,947,949],{},[662,940,664],{},[662,942,668],{"align":667},[662,944,560],{"align":667},[662,946,568],{"align":667},[662,948,564],{"align":667},[662,950,636],{"align":677},[679,952,953,973,993,1015,1036,1056,1076,1096,1116,1136,1156,1176,1196],{},[659,954,955,961,963,965,967,969],{},[684,956,957],{},[687,958,960],{"tip":959},"Automatically masks fields like password, token, email, creditCard in production output. Configurable via a redact list.","Built-in PII redaction (auto in prod)",[684,962,540],{"align":667},[684,964,782],{"align":667},[684,966,713],{"align":667},[684,968,713],{"align":667},[684,970,971],{"align":677},[558,972,668],{},[659,974,975,981,983,985,987,989],{},[684,976,977],{},[687,978,980],{"tip":979},"Drop a percentage of low-importance events at emit time (head) or based on the final outcome like errors \u002F slow requests (tail).","Head + tail sampling",[684,982,540],{"align":667},[684,984,782],{"align":667},[684,986,713],{"align":667},[684,988,713],{"align":667},[684,990,991],{"align":677},[558,992,668],{},[659,994,995,1001,1004,1007,1009,1011],{},[684,996,997],{},[687,998,1000],{"tip":999},"Whether log shipping runs off the hot path. evlog uses fire-and-forget drains (with waitUntil on edge); pino \u002F winston use a worker thread for hard isolation.","Async I\u002FO for shipping logs",[684,1002,1003],{"align":667},"via drains",[684,1005,1006],{"align":667},"Worker thread",[684,1008,713],{"align":667},[684,1010,1006],{"align":667},[684,1012,1013],{"align":677},[558,1014,888],{},[659,1016,1017,1023,1025,1028,1030,1032],{},[684,1018,1019],{},[687,1020,1022],{"tip":1021},"Built-in batching, exponential retry on failure, and fan-out to multiple destinations — without writing transport plumbing yourself.","Drain pipeline (batch \u002F retry \u002F fan-out)",[684,1024,540],{"align":667},[684,1026,1027],{"align":667},"via transports",[684,1029,713],{"align":667},[684,1031,1027],{"align":667},[684,1033,1034],{"align":677},[558,1035,668],{},[659,1037,1038,1044,1046,1048,1050,1052],{},[684,1039,1040],{},[687,1041,1043],{"tip":1042},"Send the same event to multiple destinations (e.g. Axiom + Sentry + your DB) in parallel without duplicating emit calls.","Multi-destination fan-out",[684,1045,693],{"align":667},[684,1047,693],{"align":667},[684,1049,713],{"align":667},[684,1051,693],{"align":667},[684,1053,1054],{"align":677},[558,1055,746],{},[659,1057,1058,1064,1066,1068,1070,1072],{},[684,1059,1060],{},[687,1061,1063],{"tip":1062},"Append-only log of security-sensitive events (auth, billing, admin actions) with a hash chain so tampering can be detected after the fact.","Audit trail (tamper-evident chain)",[684,1065,540],{"align":667},[684,1067,713],{"align":667},[684,1069,713],{"align":667},[684,1071,713],{"align":667},[684,1073,1074],{"align":677},[558,1075,668],{},[659,1077,1078,1084,1086,1088,1090,1092],{},[684,1079,1080],{},[687,1081,1083],{"tip":1082},"Auto-attach derived context like parsed user-agent, GeoIP, request size, and W3C traceparent without writing middleware.","Built-in enrichers (UA \u002F Geo \u002F Trace \u002F Size)",[684,1085,540],{"align":667},[684,1087,713],{"align":667},[684,1089,713],{"align":667},[684,1091,713],{"align":667},[684,1093,1094],{"align":677},[558,1095,668],{},[659,1097,1098,1104,1106,1108,1110,1112],{},[684,1099,1100],{},[687,1101,1103],{"tip":1102},"Strips authorization, cookie, x-api-key, set-cookie etc. before they reach an adapter — no risk of leaking auth tokens to your observability vendor.","Sensitive header filtering",[684,1105,540],{"align":667},[684,1107,782],{"align":667},[684,1109,713],{"align":667},[684,1111,782],{"align":667},[684,1113,1114],{"align":677},[558,1115,668],{},[659,1117,1118,1124,1126,1128,1130,1132],{},[684,1119,1120],{},[687,1121,1123],{"tip":1122},"Reads incoming W3C traceparent \u002F tracestate headers and propagates them through the wide event for distributed tracing correlation.","W3C trace context (traceparent)",[684,1125,540],{"align":667},[684,1127,713],{"align":667},[684,1129,713],{"align":667},[684,1131,713],{"align":667},[684,1133,1134],{"align":677},[558,1135,668],{},[659,1137,1138,1144,1146,1148,1150,1152],{},[684,1139,1140],{},[687,1141,1143],{"tip":1142},"Drop-in middleware for Vercel AI SDK that auto-tracks token usage, tool calls, streaming metrics, and cost per LLM call.","AI SDK integration (tokens \u002F tools \u002F streaming)",[684,1145,540],{"align":667},[684,1147,713],{"align":667},[684,1149,713],{"align":667},[684,1151,713],{"align":667},[684,1153,1154],{"align":677},[558,1155,668],{},[659,1157,1158,1164,1166,1168,1170,1172],{},[684,1159,1160],{},[687,1161,1163],{"tip":1162},"One-line plugin for Better Auth that emits wide events for sign-in, sign-up, password reset, session refresh, and revocation.","Better Auth integration",[684,1165,540],{"align":667},[684,1167,713],{"align":667},[684,1169,713],{"align":667},[684,1171,713],{"align":667},[684,1173,1174],{"align":677},[558,1175,668],{},[659,1177,1178,1184,1186,1188,1190,1192],{},[684,1179,1180],{},[687,1181,1183],{"tip":1182},"Store logs in your own NuxtHub-hosted database with automatic retention — no external observability vendor required.","Self-hosted storage (NuxtHub adapter)",[684,1185,540],{"align":667},[684,1187,713],{"align":667},[684,1189,713],{"align":667},[684,1191,713],{"align":667},[684,1193,1194],{"align":677},[558,1195,668],{},[659,1197,1198,1204,1206,1208,1210,1212],{},[684,1199,1200],{},[687,1201,1203],{"tip":1202},"First-class support for Cloudflare Workers and Vercel Edge with waitUntil() integration so drains finish before the runtime terminates.","Edge \u002F Workers runtime",[684,1205,540],{"align":667},[684,1207,739],{"align":667},[684,1209,713],{"align":667},[684,1211,713],{"align":667},[684,1213,1214],{"align":677},[558,1215,668],{},[648,1217,1219],{"id":1218},"footprint-and-ecosystem","Footprint and ecosystem",[653,1221,1222,1238],{},[656,1223,1224],{},[659,1225,1226,1228,1230,1232,1234,1236],{},[662,1227,664],{},[662,1229,668],{"align":667},[662,1231,560],{"align":667},[662,1233,568],{"align":667},[662,1235,564],{"align":667},[662,1237,636],{"align":677},[679,1239,1240,1261,1284,1308,1329,1349,1369,1389],{},[659,1241,1242,1248,1250,1253,1255,1257],{},[684,1243,1244],{},[687,1245,1247],{"tip":1246},"evlog itself ships no production deps. Adapters lazy-load their vendor SDKs only when imported.","Zero transitive dependencies",[684,1249,693],{"align":667},[684,1251,1252],{"align":667},"1 dep",[684,1254,713],{"align":667},[684,1256,713],{"align":667},[684,1258,1259],{"align":677},[558,1260,668],{},[659,1262,1263,1269,1272,1274,1277,1280],{},[684,1264,1265],{},[687,1266,1268],{"tip":1267},"Approximate gzipped size of the core logger when imported into a server bundle. Smaller is better for cold-start time on serverless.","Bundle size (gzip)",[684,1270,1271],{"align":667},"~6 kB",[684,1273,1271],{"align":667},[684,1275,1276],{"align":667},"~12 kB",[684,1278,1279],{"align":667},"~50 kB",[684,1281,1282],{"align":677},[558,1283,668],{},[659,1285,1286,1292,1295,1298,1301,1304],{},[684,1287,1288],{},[687,1289,1291],{"tip":1290},"How many full request lifecycles (start → set\u002Fset\u002Fset → emit) the logger can complete per second on a single core. See packages\u002Fevlog\u002Fbench\u002F for the methodology.","Wide event lifecycle throughput",[684,1293,1294],{"align":667},"1.58M ops\u002Fs",[684,1296,1297],{"align":667},"206K ops\u002Fs",[684,1299,1300],{"align":667},"n\u002Fa",[684,1302,1303],{"align":667},"112K ops\u002Fs",[684,1305,1306],{"align":677},[558,1307,668],{},[659,1309,1310,1316,1318,1321,1323,1325],{},[684,1311,1312],{},[687,1313,1315],{"tip":1314},"One-line installs for Nuxt, Nitro, Next.js, SvelteKit, TanStack Start, React Router, NestJS, Express, Hono, Fastify, Elysia, Cloudflare Workers, and Vercel Edge.","Framework auto-init (13+ integrations)",[684,1317,693],{"align":667},[684,1319,1320],{"align":667},"HTTP only",[684,1322,713],{"align":667},[684,1324,713],{"align":667},[684,1326,1327],{"align":677},[558,1328,668],{},[659,1330,1331,1337,1339,1341,1343,1345],{},[684,1332,1333],{},[687,1334,1336],{"tip":1335},"Browser logger that batches client-side events and ships them to your server over HTTP, where they merge into the wide event lifecycle.","Client → server log transport",[684,1338,693],{"align":667},[684,1340,713],{"align":667},[684,1342,713],{"align":667},[684,1344,713],{"align":667},[684,1346,1347],{"align":677},[558,1348,668],{},[659,1350,1351,1357,1359,1361,1363,1365],{},[684,1352,1353],{},[687,1354,1356],{"tip":1355},"Build-time console.log → log.info rewrite so you can adopt evlog without manually editing every file.","Vite plugin (auto-replace console.log)",[684,1358,693],{"align":667},[684,1360,713],{"align":667},[684,1362,713],{"align":667},[684,1364,713],{"align":667},[684,1366,1367],{"align":677},[558,1368,668],{},[659,1370,1371,1377,1379,1381,1383,1385],{},[684,1372,1373],{},[687,1374,1376],{"tip":1375},"Skip logging entirely for paths like \u002Fhealth or \u002Fmetrics using glob patterns — keeps your noise floor low without adding middleware.","Path filtering (include \u002F exclude globs)",[684,1378,540],{"align":667},[684,1380,782],{"align":667},[684,1382,713],{"align":667},[684,1384,782],{"align":667},[684,1386,1387],{"align":677},[558,1388,668],{},[659,1390,1391,1397,1399,1401,1403,1405],{},[684,1392,1393],{},[687,1394,1396],{"tip":1395},"Bundled .skill.md files so AI coding agents write evlog code in the right style without you teaching them every time.","AI agent skills (Cursor \u002F Claude \u002F ChatGPT)",[684,1398,693],{"align":667},[684,1400,713],{"align":667},[684,1402,713],{"align":667},[684,1404,713],{"align":667},[684,1406,1407],{"align":677},[558,1408,668],{},[554,1410,1411,1412,1415,1416,1419,1420,1423,1424,1428],{},"Counted up across the three tables (33 rows total): evlog wins ",[558,1413,1414],{},"23"," rows outright, ties on ",[558,1417,1418],{},"6",", and loses ",[558,1421,1422],{},"4"," — custom levels, runtime level mutation, plugin\u002Fserializer system, and async-I\u002FO on a worker thread. All four losses are documented in ",[603,1425,1427],{"href":1426},"#honest-gaps-today","Honest gaps"," below so you know what you're trading off.",[554,1430,1431,1432,1440,1441,1444],{},"See ",[603,1433,1437],{"href":1434,"rel":1435},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fpackages\u002Fevlog\u002Fbench",[1436],"nofollow",[586,1438,1439],{},"packages\u002Fevlog\u002Fbench\u002F"," for the open-source benchmarks behind the throughput numbers, and the ",[603,1442,1443],{"href":189},"Performance page"," for the full breakdown.",[571,1446,1448],{"id":1447},"honest-gaps-today","Honest gaps (today)",[554,1450,1451],{},"We'd rather you read this list than discover the limits the hard way. Each item is a potential future Linear ticket — none of them are currently blocking for the workloads we've shipped evlog on.",[648,1453,1455,1456],{"id":1454},"no-persistent-bindings-shorthand-on-log","No persistent-bindings shorthand on ",[586,1457,1458],{},"log.*",[554,1460,1461,1462,1465,1466,1468],{},"pino has ",[586,1463,1464],{},"log.child({ component: 'auth' })"," that returns a new logger inheriting both the parent's bindings and the child's. evlog's simple ",[586,1467,1458],{}," API is global; to attach persistent context you create a wide-event logger:",[1470,1471,1476],"pre",{"className":1472,"code":1473,"language":1474,"meta":1475,"style":1475},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createLogger } from 'evlog'\n\nconst log = createLogger({ component: 'auth' })\nlog.set({ userId: 42 })\nlog.emit()\n","typescript","",[586,1477,1478,1510,1517,1559,1588],{"__ignoreMap":1475},[1479,1480,1483,1487,1491,1495,1498,1501,1504,1507],"span",{"class":1481,"line":1482},"line",1,[1479,1484,1486],{"class":1485},"s7zQu","import",[1479,1488,1490],{"class":1489},"sMK4o"," {",[1479,1492,1494],{"class":1493},"sTEyZ"," createLogger",[1479,1496,1497],{"class":1489}," }",[1479,1499,1500],{"class":1485}," from",[1479,1502,1503],{"class":1489}," '",[1479,1505,668],{"class":1506},"sfazB",[1479,1508,1509],{"class":1489},"'\n",[1479,1511,1513],{"class":1481,"line":1512},2,[1479,1514,1516],{"emptyLinePlaceholder":1515},true,"\n",[1479,1518,1520,1524,1527,1530,1533,1536,1539,1543,1546,1548,1551,1554,1556],{"class":1481,"line":1519},3,[1479,1521,1523],{"class":1522},"spNyl","const",[1479,1525,1526],{"class":1493}," log ",[1479,1528,1529],{"class":1489},"=",[1479,1531,1494],{"class":1532},"s2Zo4",[1479,1534,1535],{"class":1493},"(",[1479,1537,1538],{"class":1489},"{",[1479,1540,1542],{"class":1541},"swJcz"," component",[1479,1544,1545],{"class":1489},":",[1479,1547,1503],{"class":1489},[1479,1549,1550],{"class":1506},"auth",[1479,1552,1553],{"class":1489},"'",[1479,1555,1497],{"class":1489},[1479,1557,1558],{"class":1493},")\n",[1479,1560,1562,1565,1568,1571,1573,1575,1578,1580,1584,1586],{"class":1481,"line":1561},4,[1479,1563,1564],{"class":1493},"log",[1479,1566,1567],{"class":1489},".",[1479,1569,1570],{"class":1532},"set",[1479,1572,1535],{"class":1493},[1479,1574,1538],{"class":1489},[1479,1576,1577],{"class":1541}," userId",[1479,1579,1545],{"class":1489},[1479,1581,1583],{"class":1582},"sbssI"," 42",[1479,1585,1497],{"class":1489},[1479,1587,1558],{"class":1493},[1479,1589,1591,1593,1595,1598],{"class":1481,"line":1590},5,[1479,1592,1564],{"class":1493},[1479,1594,1567],{"class":1489},[1479,1596,1597],{"class":1532},"emit",[1479,1599,1600],{"class":1493},"()\n",[554,1602,1603,1604,1607,1608,1611],{},"Or, in framework integrations, the request middleware does it for you. This works but it's not the same ergonomic shape as ",[586,1605,1606],{},"pino.child",". A ",[586,1609,1610],{},"log.child(bindings)"," shorthand is a likely next addition.",[648,1613,1615,1618],{"id":1614},"minlevel-is-set-once-at-startup",[586,1616,1617],{},"minLevel"," is set once at startup",[554,1620,1621,1622,1624,1625,1628,1629,1632,1633,1636,1637,1640],{},"You configure ",[586,1623,1617],{}," in ",[586,1626,1627],{},"initLogger({ minLevel: 'info' })"," and that's it for the process lifetime. pino lets you mutate ",[586,1630,1631],{},"logger.level = 'debug'"," at runtime (handy for ",[586,1634,1635],{},"--verbose"," flags or hot-reload). The workaround today is to call ",[586,1638,1639],{},"initLogger"," again before locking — fine for CLIs that read flags before any logging, awkward for runtime toggles.",[648,1642,1644],{"id":1643},"no-custom-levels","No custom levels",[554,1646,1647,1648,1651,1652,1651,1654,1651,1657,1660,1661,561,1664,561,1667,1670,1671,1673,1674,1676],{},"evlog ships ",[586,1649,1650],{},"debug"," \u002F ",[586,1653,641],{},[586,1655,1656],{},"warn",[586,1658,1659],{},"error"," and that's it. pino, consola, and winston all let you define ",[586,1662,1663],{},"trace",[586,1665,1666],{},"notice",[586,1668,1669],{},"fatal",", etc. We chose four levels on purpose (most teams never use more than four), but if your existing pipeline depends on ",[586,1672,1669],{}," or ",[586,1675,1663],{}," you'll need to map them onto the closest evlog level.",[648,1678,1680,1681],{"id":1679},"no-multi-stream-transport-array-on-log","No multi-stream \u002F transport array on ",[586,1682,1458],{},[554,1684,1685,1686,1689,1690,1693],{},"pino lets you pipe a single log to multiple destinations via ",[586,1687,1688],{},"pino.multistream",". evlog does the same via ",[603,1691,1692],{"href":515},"the drain pipeline"," (one drain that fans out to N adapters, with batching and retry shared across all of them) — but the mental model is different. If you've structured your existing code around \"stream A is debug to stdout, stream B is warn+ to a file, stream C is error to Sentry\", you'll rebuild that as drain-level routing instead.",[648,1695,1697],{"id":1696},"no-formatter-serializer-plugin-system","No formatter \u002F serializer plugin system",[554,1699,1461,1700,1703,1704,588,1707,1710,1711,1567],{},[586,1701,1702],{},"serializers"," for converting common types (errors, requests, responses) into JSON. evlog handles the common cases via the redaction layer and the built-in error serialization (",[586,1705,1706],{},"createError",[586,1708,1709],{},"parseError","); for anything custom (e.g. masking a particular field or transforming a payload), you write it inside a custom drain or before calling ",[586,1712,1713],{},"log.set",[571,1715,1717],{"id":1716},"migrating-from","Migrating from",[554,1719,1720,1721,1724,1725,1728],{},"Pick the tab that matches your current logger. Each tab shows the ",[558,1722,1723],{},"before"," code in that library's own API. Underneath the tabs is the single ",[558,1726,1727],{},"after"," snippet — the same evlog code regardless of where you came from.",[1730,1731,1732,2169,2634,2946],"code-group",{},[1470,1733,1735],{"className":1472,"code":1734,"filename":560,"language":1474,"meta":1475,"style":1475},"import pino from 'pino'\n\nconst log = pino({ name: 'checkout' })\nconst child = log.child({ flow: 'checkout' })\n\nchild.info({ event: 'checkout_started' })\n\ntry {\n  const cart = await getCart(userId)\n  child.info({ cart: { items: cart.items.length, total: cart.total } }, 'cart loaded')\n\n  const charge = await stripe.charge(cart.total)\n  child.info({ stripe: { chargeId: charge.id } }, 'charge ok')\n\n  if (!charge.success) {\n    throw new Error(`Payment failed: ${charge.decline_reason}`)\n  }\n} catch (err) {\n  child.error({ err }, 'checkout failed')\n  throw err\n}\n",[586,1736,1737,1753,1757,1788,1824,1828,1857,1862,1871,1896,1962,1967,1998,2042,2047,2072,2107,2113,2127,2154,2163],{"__ignoreMap":1475},[1479,1738,1739,1741,1744,1747,1749,1751],{"class":1481,"line":1482},[1479,1740,1486],{"class":1485},[1479,1742,1743],{"class":1493}," pino ",[1479,1745,1746],{"class":1485},"from",[1479,1748,1503],{"class":1489},[1479,1750,560],{"class":1506},[1479,1752,1509],{"class":1489},[1479,1754,1755],{"class":1481,"line":1512},[1479,1756,1516],{"emptyLinePlaceholder":1515},[1479,1758,1759,1761,1763,1765,1768,1770,1772,1775,1777,1779,1782,1784,1786],{"class":1481,"line":1519},[1479,1760,1523],{"class":1522},[1479,1762,1526],{"class":1493},[1479,1764,1529],{"class":1489},[1479,1766,1767],{"class":1532}," pino",[1479,1769,1535],{"class":1493},[1479,1771,1538],{"class":1489},[1479,1773,1774],{"class":1541}," name",[1479,1776,1545],{"class":1489},[1479,1778,1503],{"class":1489},[1479,1780,1781],{"class":1506},"checkout",[1479,1783,1553],{"class":1489},[1479,1785,1497],{"class":1489},[1479,1787,1558],{"class":1493},[1479,1789,1790,1792,1795,1797,1800,1802,1805,1807,1809,1812,1814,1816,1818,1820,1822],{"class":1481,"line":1561},[1479,1791,1523],{"class":1522},[1479,1793,1794],{"class":1493}," child ",[1479,1796,1529],{"class":1489},[1479,1798,1799],{"class":1493}," log",[1479,1801,1567],{"class":1489},[1479,1803,1804],{"class":1532},"child",[1479,1806,1535],{"class":1493},[1479,1808,1538],{"class":1489},[1479,1810,1811],{"class":1541}," flow",[1479,1813,1545],{"class":1489},[1479,1815,1503],{"class":1489},[1479,1817,1781],{"class":1506},[1479,1819,1553],{"class":1489},[1479,1821,1497],{"class":1489},[1479,1823,1558],{"class":1493},[1479,1825,1826],{"class":1481,"line":1590},[1479,1827,1516],{"emptyLinePlaceholder":1515},[1479,1829,1831,1833,1835,1837,1839,1841,1844,1846,1848,1851,1853,1855],{"class":1481,"line":1830},6,[1479,1832,1804],{"class":1493},[1479,1834,1567],{"class":1489},[1479,1836,641],{"class":1532},[1479,1838,1535],{"class":1493},[1479,1840,1538],{"class":1489},[1479,1842,1843],{"class":1541}," event",[1479,1845,1545],{"class":1489},[1479,1847,1503],{"class":1489},[1479,1849,1850],{"class":1506},"checkout_started",[1479,1852,1553],{"class":1489},[1479,1854,1497],{"class":1489},[1479,1856,1558],{"class":1493},[1479,1858,1860],{"class":1481,"line":1859},7,[1479,1861,1516],{"emptyLinePlaceholder":1515},[1479,1863,1865,1868],{"class":1481,"line":1864},8,[1479,1866,1867],{"class":1485},"try",[1479,1869,1870],{"class":1489}," {\n",[1479,1872,1874,1877,1880,1883,1886,1889,1891,1894],{"class":1481,"line":1873},9,[1479,1875,1876],{"class":1522},"  const",[1479,1878,1879],{"class":1493}," cart",[1479,1881,1882],{"class":1489}," =",[1479,1884,1885],{"class":1485}," await",[1479,1887,1888],{"class":1532}," getCart",[1479,1890,1535],{"class":1541},[1479,1892,1893],{"class":1493},"userId",[1479,1895,1558],{"class":1541},[1479,1897,1899,1902,1904,1906,1908,1910,1912,1914,1916,1919,1921,1923,1925,1928,1930,1933,1936,1939,1941,1943,1945,1948,1950,1953,1955,1958,1960],{"class":1481,"line":1898},10,[1479,1900,1901],{"class":1493},"  child",[1479,1903,1567],{"class":1489},[1479,1905,641],{"class":1532},[1479,1907,1535],{"class":1541},[1479,1909,1538],{"class":1489},[1479,1911,1879],{"class":1541},[1479,1913,1545],{"class":1489},[1479,1915,1490],{"class":1489},[1479,1917,1918],{"class":1541}," items",[1479,1920,1545],{"class":1489},[1479,1922,1879],{"class":1493},[1479,1924,1567],{"class":1489},[1479,1926,1927],{"class":1493},"items",[1479,1929,1567],{"class":1489},[1479,1931,1932],{"class":1493},"length",[1479,1934,1935],{"class":1489},",",[1479,1937,1938],{"class":1541}," total",[1479,1940,1545],{"class":1489},[1479,1942,1879],{"class":1493},[1479,1944,1567],{"class":1489},[1479,1946,1947],{"class":1493},"total",[1479,1949,1497],{"class":1489},[1479,1951,1952],{"class":1489}," },",[1479,1954,1503],{"class":1489},[1479,1956,1957],{"class":1506},"cart loaded",[1479,1959,1553],{"class":1489},[1479,1961,1558],{"class":1541},[1479,1963,1965],{"class":1481,"line":1964},11,[1479,1966,1516],{"emptyLinePlaceholder":1515},[1479,1968,1970,1972,1975,1977,1979,1982,1984,1987,1989,1992,1994,1996],{"class":1481,"line":1969},12,[1479,1971,1876],{"class":1522},[1479,1973,1974],{"class":1493}," charge",[1479,1976,1882],{"class":1489},[1479,1978,1885],{"class":1485},[1479,1980,1981],{"class":1493}," stripe",[1479,1983,1567],{"class":1489},[1479,1985,1986],{"class":1532},"charge",[1479,1988,1535],{"class":1541},[1479,1990,1991],{"class":1493},"cart",[1479,1993,1567],{"class":1489},[1479,1995,1947],{"class":1493},[1479,1997,1558],{"class":1541},[1479,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2020,2022,2024,2026,2029,2031,2033,2035,2038,2040],{"class":1481,"line":2000},13,[1479,2002,1901],{"class":1493},[1479,2004,1567],{"class":1489},[1479,2006,641],{"class":1532},[1479,2008,1535],{"class":1541},[1479,2010,1538],{"class":1489},[1479,2012,1981],{"class":1541},[1479,2014,1545],{"class":1489},[1479,2016,1490],{"class":1489},[1479,2018,2019],{"class":1541}," chargeId",[1479,2021,1545],{"class":1489},[1479,2023,1974],{"class":1493},[1479,2025,1567],{"class":1489},[1479,2027,2028],{"class":1493},"id",[1479,2030,1497],{"class":1489},[1479,2032,1952],{"class":1489},[1479,2034,1503],{"class":1489},[1479,2036,2037],{"class":1506},"charge ok",[1479,2039,1553],{"class":1489},[1479,2041,1558],{"class":1541},[1479,2043,2045],{"class":1481,"line":2044},14,[1479,2046,1516],{"emptyLinePlaceholder":1515},[1479,2048,2050,2053,2056,2059,2061,2063,2066,2069],{"class":1481,"line":2049},15,[1479,2051,2052],{"class":1485},"  if",[1479,2054,2055],{"class":1541}," (",[1479,2057,2058],{"class":1489},"!",[1479,2060,1986],{"class":1493},[1479,2062,1567],{"class":1489},[1479,2064,2065],{"class":1493},"success",[1479,2067,2068],{"class":1541},") ",[1479,2070,2071],{"class":1489},"{\n",[1479,2073,2075,2078,2081,2084,2086,2089,2092,2095,2097,2099,2102,2105],{"class":1481,"line":2074},16,[1479,2076,2077],{"class":1485},"    throw",[1479,2079,2080],{"class":1489}," new",[1479,2082,2083],{"class":1532}," Error",[1479,2085,1535],{"class":1541},[1479,2087,2088],{"class":1489},"`",[1479,2090,2091],{"class":1506},"Payment failed: ",[1479,2093,2094],{"class":1489},"${",[1479,2096,1986],{"class":1493},[1479,2098,1567],{"class":1489},[1479,2100,2101],{"class":1493},"decline_reason",[1479,2103,2104],{"class":1489},"}`",[1479,2106,1558],{"class":1541},[1479,2108,2110],{"class":1481,"line":2109},17,[1479,2111,2112],{"class":1489},"  }\n",[1479,2114,2116,2119,2122,2125],{"class":1481,"line":2115},18,[1479,2117,2118],{"class":1489},"}",[1479,2120,2121],{"class":1485}," catch",[1479,2123,2124],{"class":1493}," (err) ",[1479,2126,2071],{"class":1489},[1479,2128,2130,2132,2134,2136,2138,2140,2143,2145,2147,2150,2152],{"class":1481,"line":2129},19,[1479,2131,1901],{"class":1493},[1479,2133,1567],{"class":1489},[1479,2135,1659],{"class":1532},[1479,2137,1535],{"class":1541},[1479,2139,1538],{"class":1489},[1479,2141,2142],{"class":1493}," err",[1479,2144,1952],{"class":1489},[1479,2146,1503],{"class":1489},[1479,2148,2149],{"class":1506},"checkout failed",[1479,2151,1553],{"class":1489},[1479,2153,1558],{"class":1541},[1479,2155,2157,2160],{"class":1481,"line":2156},20,[1479,2158,2159],{"class":1485},"  throw",[1479,2161,2162],{"class":1493}," err\n",[1479,2164,2166],{"class":1481,"line":2165},21,[1479,2167,2168],{"class":1489},"}\n",[1470,2170,2172],{"className":1472,"code":2171,"filename":564,"language":1474,"meta":1475,"style":1475},"import { createLogger as createWinston, format, transports } from 'winston'\n\nconst log = createWinston({\n  defaultMeta: { service: 'checkout' },\n  format: format.combine(format.timestamp(), format.json()),\n  transports: [new transports.Console()],\n})\n\nlog.info({ event: 'checkout_started', flow: 'checkout' })\n\ntry {\n  const cart = await getCart(userId)\n  log.info({ flow: 'checkout', cart: { items: cart.items.length, total: cart.total } })\n\n  const charge = await stripe.charge(cart.total)\n  log.info({ flow: 'checkout', stripe: { chargeId: charge.id } })\n\n  if (!charge.success) {\n    throw new Error(`Payment failed: ${charge.decline_reason}`)\n  }\n} catch (err) {\n  log.error({ flow: 'checkout', err })\n  throw err\n}\n",[586,2173,2174,2208,2212,2226,2249,2289,2314,2320,2324,2362,2366,2372,2390,2453,2457,2483,2529,2533,2551,2577,2581,2591,2622,2629],{"__ignoreMap":1475},[1479,2175,2176,2178,2180,2182,2185,2188,2190,2193,2195,2198,2200,2202,2204,2206],{"class":1481,"line":1482},[1479,2177,1486],{"class":1485},[1479,2179,1490],{"class":1489},[1479,2181,1494],{"class":1493},[1479,2183,2184],{"class":1485}," as",[1479,2186,2187],{"class":1493}," createWinston",[1479,2189,1935],{"class":1489},[1479,2191,2192],{"class":1493}," format",[1479,2194,1935],{"class":1489},[1479,2196,2197],{"class":1493}," transports",[1479,2199,1497],{"class":1489},[1479,2201,1500],{"class":1485},[1479,2203,1503],{"class":1489},[1479,2205,564],{"class":1506},[1479,2207,1509],{"class":1489},[1479,2209,2210],{"class":1481,"line":1512},[1479,2211,1516],{"emptyLinePlaceholder":1515},[1479,2213,2214,2216,2218,2220,2222,2224],{"class":1481,"line":1519},[1479,2215,1523],{"class":1522},[1479,2217,1526],{"class":1493},[1479,2219,1529],{"class":1489},[1479,2221,2187],{"class":1532},[1479,2223,1535],{"class":1493},[1479,2225,2071],{"class":1489},[1479,2227,2228,2231,2233,2235,2238,2240,2242,2244,2246],{"class":1481,"line":1561},[1479,2229,2230],{"class":1541},"  defaultMeta",[1479,2232,1545],{"class":1489},[1479,2234,1490],{"class":1489},[1479,2236,2237],{"class":1541}," service",[1479,2239,1545],{"class":1489},[1479,2241,1503],{"class":1489},[1479,2243,1781],{"class":1506},[1479,2245,1553],{"class":1489},[1479,2247,2248],{"class":1489}," },\n",[1479,2250,2251,2254,2256,2258,2260,2263,2266,2268,2271,2274,2276,2278,2280,2283,2286],{"class":1481,"line":1590},[1479,2252,2253],{"class":1541},"  format",[1479,2255,1545],{"class":1489},[1479,2257,2192],{"class":1493},[1479,2259,1567],{"class":1489},[1479,2261,2262],{"class":1532},"combine",[1479,2264,2265],{"class":1493},"(format",[1479,2267,1567],{"class":1489},[1479,2269,2270],{"class":1532},"timestamp",[1479,2272,2273],{"class":1493},"()",[1479,2275,1935],{"class":1489},[1479,2277,2192],{"class":1493},[1479,2279,1567],{"class":1489},[1479,2281,2282],{"class":1532},"json",[1479,2284,2285],{"class":1493},"())",[1479,2287,2288],{"class":1489},",\n",[1479,2290,2291,2294,2296,2299,2302,2304,2306,2309,2312],{"class":1481,"line":1830},[1479,2292,2293],{"class":1541},"  transports",[1479,2295,1545],{"class":1489},[1479,2297,2298],{"class":1493}," [",[1479,2300,2301],{"class":1489},"new",[1479,2303,2197],{"class":1493},[1479,2305,1567],{"class":1489},[1479,2307,2308],{"class":1532},"Console",[1479,2310,2311],{"class":1493},"()]",[1479,2313,2288],{"class":1489},[1479,2315,2316,2318],{"class":1481,"line":1859},[1479,2317,2118],{"class":1489},[1479,2319,1558],{"class":1493},[1479,2321,2322],{"class":1481,"line":1864},[1479,2323,1516],{"emptyLinePlaceholder":1515},[1479,2325,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360],{"class":1481,"line":1873},[1479,2327,1564],{"class":1493},[1479,2329,1567],{"class":1489},[1479,2331,641],{"class":1532},[1479,2333,1535],{"class":1493},[1479,2335,1538],{"class":1489},[1479,2337,1843],{"class":1541},[1479,2339,1545],{"class":1489},[1479,2341,1503],{"class":1489},[1479,2343,1850],{"class":1506},[1479,2345,1553],{"class":1489},[1479,2347,1935],{"class":1489},[1479,2349,1811],{"class":1541},[1479,2351,1545],{"class":1489},[1479,2353,1503],{"class":1489},[1479,2355,1781],{"class":1506},[1479,2357,1553],{"class":1489},[1479,2359,1497],{"class":1489},[1479,2361,1558],{"class":1493},[1479,2363,2364],{"class":1481,"line":1898},[1479,2365,1516],{"emptyLinePlaceholder":1515},[1479,2367,2368,2370],{"class":1481,"line":1964},[1479,2369,1867],{"class":1485},[1479,2371,1870],{"class":1489},[1479,2373,2374,2376,2378,2380,2382,2384,2386,2388],{"class":1481,"line":1969},[1479,2375,1876],{"class":1522},[1479,2377,1879],{"class":1493},[1479,2379,1882],{"class":1489},[1479,2381,1885],{"class":1485},[1479,2383,1888],{"class":1532},[1479,2385,1535],{"class":1541},[1479,2387,1893],{"class":1493},[1479,2389,1558],{"class":1541},[1479,2391,2392,2395,2397,2399,2401,2403,2405,2407,2409,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437,2439,2441,2443,2445,2447,2449,2451],{"class":1481,"line":2000},[1479,2393,2394],{"class":1493},"  log",[1479,2396,1567],{"class":1489},[1479,2398,641],{"class":1532},[1479,2400,1535],{"class":1541},[1479,2402,1538],{"class":1489},[1479,2404,1811],{"class":1541},[1479,2406,1545],{"class":1489},[1479,2408,1503],{"class":1489},[1479,2410,1781],{"class":1506},[1479,2412,1553],{"class":1489},[1479,2414,1935],{"class":1489},[1479,2416,1879],{"class":1541},[1479,2418,1545],{"class":1489},[1479,2420,1490],{"class":1489},[1479,2422,1918],{"class":1541},[1479,2424,1545],{"class":1489},[1479,2426,1879],{"class":1493},[1479,2428,1567],{"class":1489},[1479,2430,1927],{"class":1493},[1479,2432,1567],{"class":1489},[1479,2434,1932],{"class":1493},[1479,2436,1935],{"class":1489},[1479,2438,1938],{"class":1541},[1479,2440,1545],{"class":1489},[1479,2442,1879],{"class":1493},[1479,2444,1567],{"class":1489},[1479,2446,1947],{"class":1493},[1479,2448,1497],{"class":1489},[1479,2450,1497],{"class":1489},[1479,2452,1558],{"class":1541},[1479,2454,2455],{"class":1481,"line":2044},[1479,2456,1516],{"emptyLinePlaceholder":1515},[1479,2458,2459,2461,2463,2465,2467,2469,2471,2473,2475,2477,2479,2481],{"class":1481,"line":2049},[1479,2460,1876],{"class":1522},[1479,2462,1974],{"class":1493},[1479,2464,1882],{"class":1489},[1479,2466,1885],{"class":1485},[1479,2468,1981],{"class":1493},[1479,2470,1567],{"class":1489},[1479,2472,1986],{"class":1532},[1479,2474,1535],{"class":1541},[1479,2476,1991],{"class":1493},[1479,2478,1567],{"class":1489},[1479,2480,1947],{"class":1493},[1479,2482,1558],{"class":1541},[1479,2484,2485,2487,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519,2521,2523,2525,2527],{"class":1481,"line":2074},[1479,2486,2394],{"class":1493},[1479,2488,1567],{"class":1489},[1479,2490,641],{"class":1532},[1479,2492,1535],{"class":1541},[1479,2494,1538],{"class":1489},[1479,2496,1811],{"class":1541},[1479,2498,1545],{"class":1489},[1479,2500,1503],{"class":1489},[1479,2502,1781],{"class":1506},[1479,2504,1553],{"class":1489},[1479,2506,1935],{"class":1489},[1479,2508,1981],{"class":1541},[1479,2510,1545],{"class":1489},[1479,2512,1490],{"class":1489},[1479,2514,2019],{"class":1541},[1479,2516,1545],{"class":1489},[1479,2518,1974],{"class":1493},[1479,2520,1567],{"class":1489},[1479,2522,2028],{"class":1493},[1479,2524,1497],{"class":1489},[1479,2526,1497],{"class":1489},[1479,2528,1558],{"class":1541},[1479,2530,2531],{"class":1481,"line":2109},[1479,2532,1516],{"emptyLinePlaceholder":1515},[1479,2534,2535,2537,2539,2541,2543,2545,2547,2549],{"class":1481,"line":2115},[1479,2536,2052],{"class":1485},[1479,2538,2055],{"class":1541},[1479,2540,2058],{"class":1489},[1479,2542,1986],{"class":1493},[1479,2544,1567],{"class":1489},[1479,2546,2065],{"class":1493},[1479,2548,2068],{"class":1541},[1479,2550,2071],{"class":1489},[1479,2552,2553,2555,2557,2559,2561,2563,2565,2567,2569,2571,2573,2575],{"class":1481,"line":2129},[1479,2554,2077],{"class":1485},[1479,2556,2080],{"class":1489},[1479,2558,2083],{"class":1532},[1479,2560,1535],{"class":1541},[1479,2562,2088],{"class":1489},[1479,2564,2091],{"class":1506},[1479,2566,2094],{"class":1489},[1479,2568,1986],{"class":1493},[1479,2570,1567],{"class":1489},[1479,2572,2101],{"class":1493},[1479,2574,2104],{"class":1489},[1479,2576,1558],{"class":1541},[1479,2578,2579],{"class":1481,"line":2156},[1479,2580,2112],{"class":1489},[1479,2582,2583,2585,2587,2589],{"class":1481,"line":2165},[1479,2584,2118],{"class":1489},[1479,2586,2121],{"class":1485},[1479,2588,2124],{"class":1493},[1479,2590,2071],{"class":1489},[1479,2592,2594,2596,2598,2600,2602,2604,2606,2608,2610,2612,2614,2616,2618,2620],{"class":1481,"line":2593},22,[1479,2595,2394],{"class":1493},[1479,2597,1567],{"class":1489},[1479,2599,1659],{"class":1532},[1479,2601,1535],{"class":1541},[1479,2603,1538],{"class":1489},[1479,2605,1811],{"class":1541},[1479,2607,1545],{"class":1489},[1479,2609,1503],{"class":1489},[1479,2611,1781],{"class":1506},[1479,2613,1553],{"class":1489},[1479,2615,1935],{"class":1489},[1479,2617,2142],{"class":1493},[1479,2619,1497],{"class":1489},[1479,2621,1558],{"class":1541},[1479,2623,2625,2627],{"class":1481,"line":2624},23,[1479,2626,2159],{"class":1485},[1479,2628,2162],{"class":1493},[1479,2630,2632],{"class":1481,"line":2631},24,[1479,2633,2168],{"class":1489},[1470,2635,2637],{"className":1472,"code":2636,"filename":568,"language":1474,"meta":1475,"style":1475},"import { consola } from 'consola'\n\nconst log = consola.withTag('checkout')\n\nlog.info('Starting checkout flow')\n\ntry {\n  const cart = await getCart(userId)\n  log.info('cart loaded', { items: cart.items.length, total: cart.total })\n\n  const charge = await stripe.charge(cart.total)\n  log.info('charge ok', { chargeId: charge.id })\n\n  if (!charge.success) {\n    throw new Error(`Payment failed: ${charge.decline_reason}`)\n  }\n} catch (err) {\n  log.error('checkout failed', err)\n  throw err\n}\n",[586,2638,2639,2658,2662,2687,2691,2710,2714,2720,2738,2788,2792,2818,2852,2856,2874,2900,2904,2914,2936,2942],{"__ignoreMap":1475},[1479,2640,2641,2643,2645,2648,2650,2652,2654,2656],{"class":1481,"line":1482},[1479,2642,1486],{"class":1485},[1479,2644,1490],{"class":1489},[1479,2646,2647],{"class":1493}," consola",[1479,2649,1497],{"class":1489},[1479,2651,1500],{"class":1485},[1479,2653,1503],{"class":1489},[1479,2655,568],{"class":1506},[1479,2657,1509],{"class":1489},[1479,2659,2660],{"class":1481,"line":1512},[1479,2661,1516],{"emptyLinePlaceholder":1515},[1479,2663,2664,2666,2668,2670,2672,2674,2677,2679,2681,2683,2685],{"class":1481,"line":1519},[1479,2665,1523],{"class":1522},[1479,2667,1526],{"class":1493},[1479,2669,1529],{"class":1489},[1479,2671,2647],{"class":1493},[1479,2673,1567],{"class":1489},[1479,2675,2676],{"class":1532},"withTag",[1479,2678,1535],{"class":1493},[1479,2680,1553],{"class":1489},[1479,2682,1781],{"class":1506},[1479,2684,1553],{"class":1489},[1479,2686,1558],{"class":1493},[1479,2688,2689],{"class":1481,"line":1561},[1479,2690,1516],{"emptyLinePlaceholder":1515},[1479,2692,2693,2695,2697,2699,2701,2703,2706,2708],{"class":1481,"line":1590},[1479,2694,1564],{"class":1493},[1479,2696,1567],{"class":1489},[1479,2698,641],{"class":1532},[1479,2700,1535],{"class":1493},[1479,2702,1553],{"class":1489},[1479,2704,2705],{"class":1506},"Starting checkout flow",[1479,2707,1553],{"class":1489},[1479,2709,1558],{"class":1493},[1479,2711,2712],{"class":1481,"line":1830},[1479,2713,1516],{"emptyLinePlaceholder":1515},[1479,2715,2716,2718],{"class":1481,"line":1859},[1479,2717,1867],{"class":1485},[1479,2719,1870],{"class":1489},[1479,2721,2722,2724,2726,2728,2730,2732,2734,2736],{"class":1481,"line":1864},[1479,2723,1876],{"class":1522},[1479,2725,1879],{"class":1493},[1479,2727,1882],{"class":1489},[1479,2729,1885],{"class":1485},[1479,2731,1888],{"class":1532},[1479,2733,1535],{"class":1541},[1479,2735,1893],{"class":1493},[1479,2737,1558],{"class":1541},[1479,2739,2740,2742,2744,2746,2748,2750,2752,2754,2756,2758,2760,2762,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782,2784,2786],{"class":1481,"line":1873},[1479,2741,2394],{"class":1493},[1479,2743,1567],{"class":1489},[1479,2745,641],{"class":1532},[1479,2747,1535],{"class":1541},[1479,2749,1553],{"class":1489},[1479,2751,1957],{"class":1506},[1479,2753,1553],{"class":1489},[1479,2755,1935],{"class":1489},[1479,2757,1490],{"class":1489},[1479,2759,1918],{"class":1541},[1479,2761,1545],{"class":1489},[1479,2763,1879],{"class":1493},[1479,2765,1567],{"class":1489},[1479,2767,1927],{"class":1493},[1479,2769,1567],{"class":1489},[1479,2771,1932],{"class":1493},[1479,2773,1935],{"class":1489},[1479,2775,1938],{"class":1541},[1479,2777,1545],{"class":1489},[1479,2779,1879],{"class":1493},[1479,2781,1567],{"class":1489},[1479,2783,1947],{"class":1493},[1479,2785,1497],{"class":1489},[1479,2787,1558],{"class":1541},[1479,2789,2790],{"class":1481,"line":1898},[1479,2791,1516],{"emptyLinePlaceholder":1515},[1479,2793,2794,2796,2798,2800,2802,2804,2806,2808,2810,2812,2814,2816],{"class":1481,"line":1964},[1479,2795,1876],{"class":1522},[1479,2797,1974],{"class":1493},[1479,2799,1882],{"class":1489},[1479,2801,1885],{"class":1485},[1479,2803,1981],{"class":1493},[1479,2805,1567],{"class":1489},[1479,2807,1986],{"class":1532},[1479,2809,1535],{"class":1541},[1479,2811,1991],{"class":1493},[1479,2813,1567],{"class":1489},[1479,2815,1947],{"class":1493},[1479,2817,1558],{"class":1541},[1479,2819,2820,2822,2824,2826,2828,2830,2832,2834,2836,2838,2840,2842,2844,2846,2848,2850],{"class":1481,"line":1969},[1479,2821,2394],{"class":1493},[1479,2823,1567],{"class":1489},[1479,2825,641],{"class":1532},[1479,2827,1535],{"class":1541},[1479,2829,1553],{"class":1489},[1479,2831,2037],{"class":1506},[1479,2833,1553],{"class":1489},[1479,2835,1935],{"class":1489},[1479,2837,1490],{"class":1489},[1479,2839,2019],{"class":1541},[1479,2841,1545],{"class":1489},[1479,2843,1974],{"class":1493},[1479,2845,1567],{"class":1489},[1479,2847,2028],{"class":1493},[1479,2849,1497],{"class":1489},[1479,2851,1558],{"class":1541},[1479,2853,2854],{"class":1481,"line":2000},[1479,2855,1516],{"emptyLinePlaceholder":1515},[1479,2857,2858,2860,2862,2864,2866,2868,2870,2872],{"class":1481,"line":2044},[1479,2859,2052],{"class":1485},[1479,2861,2055],{"class":1541},[1479,2863,2058],{"class":1489},[1479,2865,1986],{"class":1493},[1479,2867,1567],{"class":1489},[1479,2869,2065],{"class":1493},[1479,2871,2068],{"class":1541},[1479,2873,2071],{"class":1489},[1479,2875,2876,2878,2880,2882,2884,2886,2888,2890,2892,2894,2896,2898],{"class":1481,"line":2049},[1479,2877,2077],{"class":1485},[1479,2879,2080],{"class":1489},[1479,2881,2083],{"class":1532},[1479,2883,1535],{"class":1541},[1479,2885,2088],{"class":1489},[1479,2887,2091],{"class":1506},[1479,2889,2094],{"class":1489},[1479,2891,1986],{"class":1493},[1479,2893,1567],{"class":1489},[1479,2895,2101],{"class":1493},[1479,2897,2104],{"class":1489},[1479,2899,1558],{"class":1541},[1479,2901,2902],{"class":1481,"line":2074},[1479,2903,2112],{"class":1489},[1479,2905,2906,2908,2910,2912],{"class":1481,"line":2109},[1479,2907,2118],{"class":1489},[1479,2909,2121],{"class":1485},[1479,2911,2124],{"class":1493},[1479,2913,2071],{"class":1489},[1479,2915,2916,2918,2920,2922,2924,2926,2928,2930,2932,2934],{"class":1481,"line":2115},[1479,2917,2394],{"class":1493},[1479,2919,1567],{"class":1489},[1479,2921,1659],{"class":1532},[1479,2923,1535],{"class":1541},[1479,2925,1553],{"class":1489},[1479,2927,2149],{"class":1506},[1479,2929,1553],{"class":1489},[1479,2931,1935],{"class":1489},[1479,2933,2142],{"class":1493},[1479,2935,1558],{"class":1541},[1479,2937,2938,2940],{"class":1481,"line":2129},[1479,2939,2159],{"class":1485},[1479,2941,2162],{"class":1493},[1479,2943,2944],{"class":1481,"line":2156},[1479,2945,2168],{"class":1489},[1470,2947,2950],{"className":1472,"code":2948,"filename":2949,"language":1474,"meta":1475,"style":1475},"console.log('[checkout] Starting checkout flow')\n\ntry {\n  const cart = await getCart(userId)\n  console.log('[checkout] cart loaded', { items: cart.items.length, total: cart.total })\n\n  const charge = await stripe.charge(cart.total)\n  console.log('[checkout] charge ok', { chargeId: charge.id })\n\n  if (!charge.success) {\n    throw new Error(`Payment failed: ${charge.decline_reason}`)\n  }\n} catch (err) {\n  console.error('[checkout] failed', err)\n  throw err\n}\n","console.log",[586,2951,2952,2972,2976,2982,3000,3052,3056,3082,3117,3121,3139,3165,3169,3179,3202,3208],{"__ignoreMap":1475},[1479,2953,2954,2957,2959,2961,2963,2965,2968,2970],{"class":1481,"line":1482},[1479,2955,2956],{"class":1493},"console",[1479,2958,1567],{"class":1489},[1479,2960,1564],{"class":1532},[1479,2962,1535],{"class":1493},[1479,2964,1553],{"class":1489},[1479,2966,2967],{"class":1506},"[checkout] Starting checkout flow",[1479,2969,1553],{"class":1489},[1479,2971,1558],{"class":1493},[1479,2973,2974],{"class":1481,"line":1512},[1479,2975,1516],{"emptyLinePlaceholder":1515},[1479,2977,2978,2980],{"class":1481,"line":1519},[1479,2979,1867],{"class":1485},[1479,2981,1870],{"class":1489},[1479,2983,2984,2986,2988,2990,2992,2994,2996,2998],{"class":1481,"line":1561},[1479,2985,1876],{"class":1522},[1479,2987,1879],{"class":1493},[1479,2989,1882],{"class":1489},[1479,2991,1885],{"class":1485},[1479,2993,1888],{"class":1532},[1479,2995,1535],{"class":1541},[1479,2997,1893],{"class":1493},[1479,2999,1558],{"class":1541},[1479,3001,3002,3005,3007,3009,3011,3013,3016,3018,3020,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050],{"class":1481,"line":1590},[1479,3003,3004],{"class":1493},"  console",[1479,3006,1567],{"class":1489},[1479,3008,1564],{"class":1532},[1479,3010,1535],{"class":1541},[1479,3012,1553],{"class":1489},[1479,3014,3015],{"class":1506},"[checkout] cart loaded",[1479,3017,1553],{"class":1489},[1479,3019,1935],{"class":1489},[1479,3021,1490],{"class":1489},[1479,3023,1918],{"class":1541},[1479,3025,1545],{"class":1489},[1479,3027,1879],{"class":1493},[1479,3029,1567],{"class":1489},[1479,3031,1927],{"class":1493},[1479,3033,1567],{"class":1489},[1479,3035,1932],{"class":1493},[1479,3037,1935],{"class":1489},[1479,3039,1938],{"class":1541},[1479,3041,1545],{"class":1489},[1479,3043,1879],{"class":1493},[1479,3045,1567],{"class":1489},[1479,3047,1947],{"class":1493},[1479,3049,1497],{"class":1489},[1479,3051,1558],{"class":1541},[1479,3053,3054],{"class":1481,"line":1830},[1479,3055,1516],{"emptyLinePlaceholder":1515},[1479,3057,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080],{"class":1481,"line":1859},[1479,3059,1876],{"class":1522},[1479,3061,1974],{"class":1493},[1479,3063,1882],{"class":1489},[1479,3065,1885],{"class":1485},[1479,3067,1981],{"class":1493},[1479,3069,1567],{"class":1489},[1479,3071,1986],{"class":1532},[1479,3073,1535],{"class":1541},[1479,3075,1991],{"class":1493},[1479,3077,1567],{"class":1489},[1479,3079,1947],{"class":1493},[1479,3081,1558],{"class":1541},[1479,3083,3084,3086,3088,3090,3092,3094,3097,3099,3101,3103,3105,3107,3109,3111,3113,3115],{"class":1481,"line":1864},[1479,3085,3004],{"class":1493},[1479,3087,1567],{"class":1489},[1479,3089,1564],{"class":1532},[1479,3091,1535],{"class":1541},[1479,3093,1553],{"class":1489},[1479,3095,3096],{"class":1506},"[checkout] charge ok",[1479,3098,1553],{"class":1489},[1479,3100,1935],{"class":1489},[1479,3102,1490],{"class":1489},[1479,3104,2019],{"class":1541},[1479,3106,1545],{"class":1489},[1479,3108,1974],{"class":1493},[1479,3110,1567],{"class":1489},[1479,3112,2028],{"class":1493},[1479,3114,1497],{"class":1489},[1479,3116,1558],{"class":1541},[1479,3118,3119],{"class":1481,"line":1873},[1479,3120,1516],{"emptyLinePlaceholder":1515},[1479,3122,3123,3125,3127,3129,3131,3133,3135,3137],{"class":1481,"line":1898},[1479,3124,2052],{"class":1485},[1479,3126,2055],{"class":1541},[1479,3128,2058],{"class":1489},[1479,3130,1986],{"class":1493},[1479,3132,1567],{"class":1489},[1479,3134,2065],{"class":1493},[1479,3136,2068],{"class":1541},[1479,3138,2071],{"class":1489},[1479,3140,3141,3143,3145,3147,3149,3151,3153,3155,3157,3159,3161,3163],{"class":1481,"line":1964},[1479,3142,2077],{"class":1485},[1479,3144,2080],{"class":1489},[1479,3146,2083],{"class":1532},[1479,3148,1535],{"class":1541},[1479,3150,2088],{"class":1489},[1479,3152,2091],{"class":1506},[1479,3154,2094],{"class":1489},[1479,3156,1986],{"class":1493},[1479,3158,1567],{"class":1489},[1479,3160,2101],{"class":1493},[1479,3162,2104],{"class":1489},[1479,3164,1558],{"class":1541},[1479,3166,3167],{"class":1481,"line":1969},[1479,3168,2112],{"class":1489},[1479,3170,3171,3173,3175,3177],{"class":1481,"line":2000},[1479,3172,2118],{"class":1489},[1479,3174,2121],{"class":1485},[1479,3176,2124],{"class":1493},[1479,3178,2071],{"class":1489},[1479,3180,3181,3183,3185,3187,3189,3191,3194,3196,3198,3200],{"class":1481,"line":2044},[1479,3182,3004],{"class":1493},[1479,3184,1567],{"class":1489},[1479,3186,1659],{"class":1532},[1479,3188,1535],{"class":1541},[1479,3190,1553],{"class":1489},[1479,3192,3193],{"class":1506},"[checkout] failed",[1479,3195,1553],{"class":1489},[1479,3197,1935],{"class":1489},[1479,3199,2142],{"class":1493},[1479,3201,1558],{"class":1541},[1479,3203,3204,3206],{"class":1481,"line":2049},[1479,3205,2159],{"class":1485},[1479,3207,2162],{"class":1493},[1479,3209,3210],{"class":1481,"line":2074},[1479,3211,2168],{"class":1489},[554,3213,3214],{},"All four become this — same code regardless of the source library:",[1470,3216,3219],{"className":1472,"code":3217,"filename":3218,"language":1474,"meta":1475,"style":1475},"import { initLogger, createLogger, createError } from 'evlog'\n\ninitLogger({ env: { service: 'checkout' } })\n\nconst log = createLogger({ flow: 'checkout' })\n\ntry {\n  const cart = await getCart(userId)\n  log.set({ cart: { items: cart.items.length, total: cart.total } })\n\n  const charge = await stripe.charge(cart.total)\n  log.set({ stripe: { chargeId: charge.id } })\n\n  if (!charge.success) {\n    throw createError({\n      message: 'Payment failed',\n      status: 402,\n      why: charge.decline_reason,\n      fix: 'Try a different payment method',\n    })\n  }\n} catch (err) {\n  log.error(err as Error)\n  throw err\n} finally {\n  log.emit()\n}\n","After (evlog)",[586,3220,3221,3249,3253,3284,3288,3316,3320,3326,3344,3394,3398,3424,3458,3462,3480,3490,3506,3518,3533,3549,3556,3560,3570,3590,3596,3606,3617],{"__ignoreMap":1475},[1479,3222,3223,3225,3227,3230,3232,3234,3236,3239,3241,3243,3245,3247],{"class":1481,"line":1482},[1479,3224,1486],{"class":1485},[1479,3226,1490],{"class":1489},[1479,3228,3229],{"class":1493}," initLogger",[1479,3231,1935],{"class":1489},[1479,3233,1494],{"class":1493},[1479,3235,1935],{"class":1489},[1479,3237,3238],{"class":1493}," createError",[1479,3240,1497],{"class":1489},[1479,3242,1500],{"class":1485},[1479,3244,1503],{"class":1489},[1479,3246,668],{"class":1506},[1479,3248,1509],{"class":1489},[1479,3250,3251],{"class":1481,"line":1512},[1479,3252,1516],{"emptyLinePlaceholder":1515},[1479,3254,3255,3257,3259,3261,3264,3266,3268,3270,3272,3274,3276,3278,3280,3282],{"class":1481,"line":1519},[1479,3256,1639],{"class":1532},[1479,3258,1535],{"class":1493},[1479,3260,1538],{"class":1489},[1479,3262,3263],{"class":1541}," env",[1479,3265,1545],{"class":1489},[1479,3267,1490],{"class":1489},[1479,3269,2237],{"class":1541},[1479,3271,1545],{"class":1489},[1479,3273,1503],{"class":1489},[1479,3275,1781],{"class":1506},[1479,3277,1553],{"class":1489},[1479,3279,1497],{"class":1489},[1479,3281,1497],{"class":1489},[1479,3283,1558],{"class":1493},[1479,3285,3286],{"class":1481,"line":1561},[1479,3287,1516],{"emptyLinePlaceholder":1515},[1479,3289,3290,3292,3294,3296,3298,3300,3302,3304,3306,3308,3310,3312,3314],{"class":1481,"line":1590},[1479,3291,1523],{"class":1522},[1479,3293,1526],{"class":1493},[1479,3295,1529],{"class":1489},[1479,3297,1494],{"class":1532},[1479,3299,1535],{"class":1493},[1479,3301,1538],{"class":1489},[1479,3303,1811],{"class":1541},[1479,3305,1545],{"class":1489},[1479,3307,1503],{"class":1489},[1479,3309,1781],{"class":1506},[1479,3311,1553],{"class":1489},[1479,3313,1497],{"class":1489},[1479,3315,1558],{"class":1493},[1479,3317,3318],{"class":1481,"line":1830},[1479,3319,1516],{"emptyLinePlaceholder":1515},[1479,3321,3322,3324],{"class":1481,"line":1859},[1479,3323,1867],{"class":1485},[1479,3325,1870],{"class":1489},[1479,3327,3328,3330,3332,3334,3336,3338,3340,3342],{"class":1481,"line":1864},[1479,3329,1876],{"class":1522},[1479,3331,1879],{"class":1493},[1479,3333,1882],{"class":1489},[1479,3335,1885],{"class":1485},[1479,3337,1888],{"class":1532},[1479,3339,1535],{"class":1541},[1479,3341,1893],{"class":1493},[1479,3343,1558],{"class":1541},[1479,3345,3346,3348,3350,3352,3354,3356,3358,3360,3362,3364,3366,3368,3370,3372,3374,3376,3378,3380,3382,3384,3386,3388,3390,3392],{"class":1481,"line":1873},[1479,3347,2394],{"class":1493},[1479,3349,1567],{"class":1489},[1479,3351,1570],{"class":1532},[1479,3353,1535],{"class":1541},[1479,3355,1538],{"class":1489},[1479,3357,1879],{"class":1541},[1479,3359,1545],{"class":1489},[1479,3361,1490],{"class":1489},[1479,3363,1918],{"class":1541},[1479,3365,1545],{"class":1489},[1479,3367,1879],{"class":1493},[1479,3369,1567],{"class":1489},[1479,3371,1927],{"class":1493},[1479,3373,1567],{"class":1489},[1479,3375,1932],{"class":1493},[1479,3377,1935],{"class":1489},[1479,3379,1938],{"class":1541},[1479,3381,1545],{"class":1489},[1479,3383,1879],{"class":1493},[1479,3385,1567],{"class":1489},[1479,3387,1947],{"class":1493},[1479,3389,1497],{"class":1489},[1479,3391,1497],{"class":1489},[1479,3393,1558],{"class":1541},[1479,3395,3396],{"class":1481,"line":1898},[1479,3397,1516],{"emptyLinePlaceholder":1515},[1479,3399,3400,3402,3404,3406,3408,3410,3412,3414,3416,3418,3420,3422],{"class":1481,"line":1964},[1479,3401,1876],{"class":1522},[1479,3403,1974],{"class":1493},[1479,3405,1882],{"class":1489},[1479,3407,1885],{"class":1485},[1479,3409,1981],{"class":1493},[1479,3411,1567],{"class":1489},[1479,3413,1986],{"class":1532},[1479,3415,1535],{"class":1541},[1479,3417,1991],{"class":1493},[1479,3419,1567],{"class":1489},[1479,3421,1947],{"class":1493},[1479,3423,1558],{"class":1541},[1479,3425,3426,3428,3430,3432,3434,3436,3438,3440,3442,3444,3446,3448,3450,3452,3454,3456],{"class":1481,"line":1969},[1479,3427,2394],{"class":1493},[1479,3429,1567],{"class":1489},[1479,3431,1570],{"class":1532},[1479,3433,1535],{"class":1541},[1479,3435,1538],{"class":1489},[1479,3437,1981],{"class":1541},[1479,3439,1545],{"class":1489},[1479,3441,1490],{"class":1489},[1479,3443,2019],{"class":1541},[1479,3445,1545],{"class":1489},[1479,3447,1974],{"class":1493},[1479,3449,1567],{"class":1489},[1479,3451,2028],{"class":1493},[1479,3453,1497],{"class":1489},[1479,3455,1497],{"class":1489},[1479,3457,1558],{"class":1541},[1479,3459,3460],{"class":1481,"line":2000},[1479,3461,1516],{"emptyLinePlaceholder":1515},[1479,3463,3464,3466,3468,3470,3472,3474,3476,3478],{"class":1481,"line":2044},[1479,3465,2052],{"class":1485},[1479,3467,2055],{"class":1541},[1479,3469,2058],{"class":1489},[1479,3471,1986],{"class":1493},[1479,3473,1567],{"class":1489},[1479,3475,2065],{"class":1493},[1479,3477,2068],{"class":1541},[1479,3479,2071],{"class":1489},[1479,3481,3482,3484,3486,3488],{"class":1481,"line":2049},[1479,3483,2077],{"class":1485},[1479,3485,3238],{"class":1532},[1479,3487,1535],{"class":1541},[1479,3489,2071],{"class":1489},[1479,3491,3492,3495,3497,3499,3502,3504],{"class":1481,"line":2074},[1479,3493,3494],{"class":1541},"      message",[1479,3496,1545],{"class":1489},[1479,3498,1503],{"class":1489},[1479,3500,3501],{"class":1506},"Payment failed",[1479,3503,1553],{"class":1489},[1479,3505,2288],{"class":1489},[1479,3507,3508,3511,3513,3516],{"class":1481,"line":2109},[1479,3509,3510],{"class":1541},"      status",[1479,3512,1545],{"class":1489},[1479,3514,3515],{"class":1582}," 402",[1479,3517,2288],{"class":1489},[1479,3519,3520,3523,3525,3527,3529,3531],{"class":1481,"line":2115},[1479,3521,3522],{"class":1541},"      why",[1479,3524,1545],{"class":1489},[1479,3526,1974],{"class":1493},[1479,3528,1567],{"class":1489},[1479,3530,2101],{"class":1493},[1479,3532,2288],{"class":1489},[1479,3534,3535,3538,3540,3542,3545,3547],{"class":1481,"line":2129},[1479,3536,3537],{"class":1541},"      fix",[1479,3539,1545],{"class":1489},[1479,3541,1503],{"class":1489},[1479,3543,3544],{"class":1506},"Try a different payment method",[1479,3546,1553],{"class":1489},[1479,3548,2288],{"class":1489},[1479,3550,3551,3554],{"class":1481,"line":2156},[1479,3552,3553],{"class":1489},"    }",[1479,3555,1558],{"class":1541},[1479,3557,3558],{"class":1481,"line":2165},[1479,3559,2112],{"class":1489},[1479,3561,3562,3564,3566,3568],{"class":1481,"line":2593},[1479,3563,2118],{"class":1489},[1479,3565,2121],{"class":1485},[1479,3567,2124],{"class":1493},[1479,3569,2071],{"class":1489},[1479,3571,3572,3574,3576,3578,3580,3583,3585,3588],{"class":1481,"line":2624},[1479,3573,2394],{"class":1493},[1479,3575,1567],{"class":1489},[1479,3577,1659],{"class":1532},[1479,3579,1535],{"class":1541},[1479,3581,3582],{"class":1493},"err",[1479,3584,2184],{"class":1485},[1479,3586,2083],{"class":3587},"sBMFI",[1479,3589,1558],{"class":1541},[1479,3591,3592,3594],{"class":1481,"line":2631},[1479,3593,2159],{"class":1485},[1479,3595,2162],{"class":1493},[1479,3597,3599,3601,3604],{"class":1481,"line":3598},25,[1479,3600,2118],{"class":1489},[1479,3602,3603],{"class":1485}," finally",[1479,3605,1870],{"class":1489},[1479,3607,3609,3611,3613,3615],{"class":1481,"line":3608},26,[1479,3610,2394],{"class":1493},[1479,3612,1567],{"class":1489},[1479,3614,1597],{"class":1532},[1479,3616,1600],{"class":1541},[1479,3618,3620],{"class":1481,"line":3619},27,[1479,3621,2168],{"class":1489},[554,3623,3624],{},"Three things changed in every migration:",[576,3626,3627,3640,3660],{},[579,3628,3629,3632,3633,3635,3636,3639],{},[558,3630,3631],{},"N log lines → 1 wide event."," The 3-4 calls per request become ",[586,3634,1713],{}," accumulations and one ",[586,3637,3638],{},"log.emit"," at the end. Your dashboard gets one queryable row instead of stitching by request id.",[579,3641,3642,3652,3653,3655,3656,3659],{},[558,3643,3644,3645,3648,3649,1567],{},"Errors carry ",[586,3646,3647],{},"why"," and ",[586,3650,3651],{},"fix"," Throwing ",[586,3654,1706],{}," instead of ",[586,3657,3658],{},"new Error"," means your client (and on-call) get actionable context, not just a stack.",[579,3661,3662,3665,3666,3668,3669,3671],{},[558,3663,3664],{},"Setup is one line."," No formatter wiring, no transport assembly, no ",[586,3667,591],{}," peer dep. ",[586,3670,1639],{}," once at boot and you're done.",[571,3673,3675],{"id":3674},"reverse-direction-when-not-to-pick-evlog","Reverse direction: when not to pick evlog",[554,3677,3678],{},"Be honest with yourself. Don't switch if:",[576,3680,3681,3692,3699],{},[579,3682,3683,3684,561,3686,561,3688,3691],{},"You ship a library that's already part of the pino ecosystem (",[586,3685,594],{},[586,3687,591],{},[586,3689,3690],{},"pino-multi-stream"," plugins) and would lose tooling.",[579,3693,3694,3695,3698],{},"You have a custom pino transport (e.g. a worker-thread Datadog forwarder you wrote in 2021) you don't want to re-implement as an evlog drain. Most of the ",[603,3696,3697],{"href":452},"built-in adapters"," cover the common destinations, but custom protocols mean a port.",[579,3700,3701],{},"You log only inside CLIs and use consola purely for the pretty terminal output. evlog's pretty output is good but not consola-grade for spinners, prompts, and box renders. Use both: evlog for events that go to a drain, consola for prompts \u002F TUIs.",[571,3703,3705],{"id":3704},"next-steps","Next Steps",[576,3707,3708,3716,3721,3727],{},[579,3709,3710,3712,3713,3715],{},[603,3711,46],{"href":47}," — the ",[586,3714,1458],{}," API, migration tabs, and patterns",[579,3717,3718,3720],{},[603,3719,51],{"href":52}," — what unlocks when you accumulate context per operation",[579,3722,3723,3726],{},[603,3724,3725],{"href":189},"Performance Benchmarks"," — the methodology behind the numbers above",[579,3728,3729,3732],{},[603,3730,3731],{"href":272},"Standalone TypeScript"," — scripts, workers, and libraries without a web framework",[3734,3735,3736],"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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":1475,"searchDepth":1512,"depth":1512,"links":3738},[3739,3740,3745,3755,3756,3757],{"id":573,"depth":1512,"text":574},{"id":629,"depth":1512,"text":630,"children":3741},[3742,3743,3744],{"id":650,"depth":1519,"text":651},{"id":931,"depth":1519,"text":932},{"id":1218,"depth":1519,"text":1219},{"id":1447,"depth":1512,"text":1448,"children":3746},[3747,3749,3751,3752,3754],{"id":1454,"depth":1519,"text":3748},"No persistent-bindings shorthand on log.*",{"id":1614,"depth":1519,"text":3750},"minLevel is set once at startup",{"id":1643,"depth":1519,"text":1644},{"id":1679,"depth":1519,"text":3753},"No multi-stream \u002F transport array on log.*",{"id":1696,"depth":1519,"text":1697},{"id":1716,"depth":1512,"text":1717},{"id":3674,"depth":1512,"text":3675},{"id":3704,"depth":1512,"text":3705},"Side-by-side comparison of evlog with pino, winston, and consola. Feature parity matrix, honest gaps, and migration snippets so you can switch with no surprises.","md",[3761,3764],{"label":3725,"icon":126,"to":189,"color":3762,"variant":3763},"neutral","subtle",{"label":46,"icon":49,"to":47,"color":3762,"variant":3763},{},{"title":30,"icon":33},{"title":549,"description":3758},"GAaHYaP5N6jSq886Fjp5xhUed9i6rswet1Rjt6n1T04",[3770,3772],{"title":25,"path":26,"stem":27,"description":3771,"icon":28,"children":-1},"AI-assisted code review and evlog adoption using Agent Skills. Let AI review your logging patterns and guide migration to wide events.",{"title":41,"path":42,"stem":43,"description":3773,"icon":44,"children":-1},"evlog gives you three ways to log. Simple one-liners, wide events that accumulate context, and auto-managed request logging. Choose the right one for your use case.",1778338245931]