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