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