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