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