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