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