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