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