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