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