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