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