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