[{"data":1,"prerenderedAt":3615},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-vs-other-loggers":388,"-getting-started-vs-other-loggers-surround":3610},[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":3599,"extension":3600,"links":3601,"meta":3606,"navigation":3607,"path":31,"seo":3608,"stem":32,"__hash__":3609},"docs\u002F1.getting-started\u002F5.vs-other-loggers.md","evlog vs pino, winston, consola",{"type":392,"value":393,"toc":3578},"minimark",[394,411,416,468,472,479,488,493,770,774,1057,1061,1250,1270,1286,1290,1293,1300,1310,1442,1453,1460,1482,1486,1518,1524,1535,1539,1555,1559,1570,3053,3056,3463,3466,3513,3517,3520,3543,3547,3574],[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 7.7x, 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,1125,1149,1170,1190,1210,1230],{},[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,1115,1118,1121],{},[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},"~6 kB",[525,1114,1112],{"align":508},[525,1116,1117],{"align":508},"~12 kB",[525,1119,1120],{"align":508},"~50 kB",[525,1122,1123],{"align":518},[399,1124,509],{},[500,1126,1127,1133,1136,1139,1142,1145],{},[525,1128,1129],{},[528,1130,1132],{"tip":1131},"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,1134,1135],{"align":508},"1.58M ops\u002Fs",[525,1137,1138],{"align":508},"206K ops\u002Fs",[525,1140,1141],{"align":508},"n\u002Fa",[525,1143,1144],{"align":508},"112K ops\u002Fs",[525,1146,1147],{"align":518},[399,1148,509],{},[500,1150,1151,1157,1159,1162,1164,1166],{},[525,1152,1153],{},[528,1154,1156],{"tip":1155},"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,1158,534],{"align":508},[525,1160,1161],{"align":508},"HTTP only",[525,1163,554],{"align":508},[525,1165,554],{"align":508},[525,1167,1168],{"align":518},[399,1169,509],{},[500,1171,1172,1178,1180,1182,1184,1186],{},[525,1173,1174],{},[528,1175,1177],{"tip":1176},"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,1179,534],{"align":508},[525,1181,554],{"align":508},[525,1183,554],{"align":508},[525,1185,554],{"align":508},[525,1187,1188],{"align":518},[399,1189,509],{},[500,1191,1192,1198,1200,1202,1204,1206],{},[525,1193,1194],{},[528,1195,1197],{"tip":1196},"Build-time console.log → log.info rewrite so you can adopt evlog without manually editing every file.","Vite plugin (auto-replace console.log)",[525,1199,534],{"align":508},[525,1201,554],{"align":508},[525,1203,554],{"align":508},[525,1205,554],{"align":508},[525,1207,1208],{"align":518},[399,1209,509],{},[500,1211,1212,1218,1220,1222,1224,1226],{},[525,1213,1214],{},[528,1215,1217],{"tip":1216},"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,1219,381],{"align":508},[525,1221,623],{"align":508},[525,1223,554],{"align":508},[525,1225,623],{"align":508},[525,1227,1228],{"align":518},[399,1229,509],{},[500,1231,1232,1238,1240,1242,1244,1246],{},[525,1233,1234],{},[528,1235,1237],{"tip":1236},"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,1239,534],{"align":508},[525,1241,554],{"align":508},[525,1243,554],{"align":508},[525,1245,554],{"align":508},[525,1247,1248],{"align":518},[399,1249,509],{},[395,1251,1252,1253,1256,1257,1260,1261,1264,1265,1269],{},"Counted up across the three tables (33 rows total): evlog wins ",[399,1254,1255],{},"23"," rows outright, ties on ",[399,1258,1259],{},"6",", and loses ",[399,1262,1263],{},"4"," — custom levels, runtime level mutation, plugin\u002Fserializer system, and async-I\u002FO on a worker thread. All four losses are documented in ",[444,1266,1268],{"href":1267},"#honest-gaps-today","Honest gaps"," below so you know what you're trading off.",[395,1271,1272,1273,1281,1282,1285],{},"See ",[444,1274,1278],{"href":1275,"rel":1276},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fpackages\u002Fevlog\u002Fbench",[1277],"nofollow",[427,1279,1280],{},"packages\u002Fevlog\u002Fbench\u002F"," for the open-source benchmarks behind the throughput numbers, and the ",[444,1283,1284],{"href":185},"Performance page"," for the full breakdown.",[412,1287,1289],{"id":1288},"honest-gaps-today","Honest gaps (today)",[395,1291,1292],{},"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,1294,1296,1297],{"id":1295},"no-persistent-bindings-shorthand-on-log","No persistent-bindings shorthand on ",[427,1298,1299],{},"log.*",[395,1301,1302,1303,1306,1307,1309],{},"pino has ",[427,1304,1305],{},"log.child({ component: 'auth' })"," that returns a new logger inheriting both the parent's bindings and the child's. evlog's simple ",[427,1308,1299],{}," API is global; to attach persistent context you create a wide-event logger:",[1311,1312,1317],"pre",{"className":1313,"code":1314,"language":1315,"meta":1316,"style":1316},"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,1318,1319,1351,1358,1400,1429],{"__ignoreMap":1316},[1320,1321,1324,1328,1332,1336,1339,1342,1345,1348],"span",{"class":1322,"line":1323},"line",1,[1320,1325,1327],{"class":1326},"s7zQu","import",[1320,1329,1331],{"class":1330},"sMK4o"," {",[1320,1333,1335],{"class":1334},"sTEyZ"," createLogger",[1320,1337,1338],{"class":1330}," }",[1320,1340,1341],{"class":1326}," from",[1320,1343,1344],{"class":1330}," '",[1320,1346,509],{"class":1347},"sfazB",[1320,1349,1350],{"class":1330},"'\n",[1320,1352,1354],{"class":1322,"line":1353},2,[1320,1355,1357],{"emptyLinePlaceholder":1356},true,"\n",[1320,1359,1361,1365,1368,1371,1374,1377,1380,1384,1387,1389,1392,1395,1397],{"class":1322,"line":1360},3,[1320,1362,1364],{"class":1363},"spNyl","const",[1320,1366,1367],{"class":1334}," log ",[1320,1369,1370],{"class":1330},"=",[1320,1372,1335],{"class":1373},"s2Zo4",[1320,1375,1376],{"class":1334},"(",[1320,1378,1379],{"class":1330},"{",[1320,1381,1383],{"class":1382},"swJcz"," component",[1320,1385,1386],{"class":1330},":",[1320,1388,1344],{"class":1330},[1320,1390,1391],{"class":1347},"auth",[1320,1393,1394],{"class":1330},"'",[1320,1396,1338],{"class":1330},[1320,1398,1399],{"class":1334},")\n",[1320,1401,1403,1406,1409,1412,1414,1416,1419,1421,1425,1427],{"class":1322,"line":1402},4,[1320,1404,1405],{"class":1334},"log",[1320,1407,1408],{"class":1330},".",[1320,1410,1411],{"class":1373},"set",[1320,1413,1376],{"class":1334},[1320,1415,1379],{"class":1330},[1320,1417,1418],{"class":1382}," userId",[1320,1420,1386],{"class":1330},[1320,1422,1424],{"class":1423},"sbssI"," 42",[1320,1426,1338],{"class":1330},[1320,1428,1399],{"class":1334},[1320,1430,1432,1434,1436,1439],{"class":1322,"line":1431},5,[1320,1433,1405],{"class":1334},[1320,1435,1408],{"class":1330},[1320,1437,1438],{"class":1373},"emit",[1320,1440,1441],{"class":1334},"()\n",[395,1443,1444,1445,1448,1449,1452],{},"Or, in framework integrations, the request middleware does it for you. This works but it's not the same ergonomic shape as ",[427,1446,1447],{},"pino.child",". A ",[427,1450,1451],{},"log.child(bindings)"," shorthand is a likely next addition.",[489,1454,1456,1459],{"id":1455},"minlevel-is-set-once-at-startup",[427,1457,1458],{},"minLevel"," is set once at startup",[395,1461,1462,1463,1465,1466,1469,1470,1473,1474,1477,1478,1481],{},"You configure ",[427,1464,1458],{}," in ",[427,1467,1468],{},"initLogger({ minLevel: 'info' })"," and that's it for the process lifetime. pino lets you mutate ",[427,1471,1472],{},"logger.level = 'debug'"," at runtime (handy for ",[427,1475,1476],{},"--verbose"," flags or hot-reload). The workaround today is to call ",[427,1479,1480],{},"initLogger"," again before locking — fine for CLIs that read flags before any logging, awkward for runtime toggles.",[489,1483,1485],{"id":1484},"no-custom-levels","No custom levels",[395,1487,1488,1489,1492,1493,1492,1495,1492,1498,1501,1502,402,1505,402,1508,1511,1512,1514,1515,1517],{},"evlog ships ",[427,1490,1491],{},"debug"," \u002F ",[427,1494,482],{},[427,1496,1497],{},"warn",[427,1499,1500],{},"error"," and that's it. pino, consola, and winston all let you define ",[427,1503,1504],{},"trace",[427,1506,1507],{},"notice",[427,1509,1510],{},"fatal",", etc. We chose four levels on purpose (most teams never use more than four), but if your existing pipeline depends on ",[427,1513,1510],{}," or ",[427,1516,1504],{}," you'll need to map them onto the closest evlog level.",[489,1519,1521,1522],{"id":1520},"no-multi-stream-transport-array-on-log","No multi-stream \u002F transport array on ",[427,1523,1299],{},[395,1525,1526,1527,1530,1531,1534],{},"pino lets you pipe a single log to multiple destinations via ",[427,1528,1529],{},"pino.multistream",". evlog does the same via ",[444,1532,1533],{"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,1536,1538],{"id":1537},"no-formatter-serializer-plugin-system","No formatter \u002F serializer plugin system",[395,1540,1302,1541,1544,1545,429,1548,1551,1552,1408],{},[427,1542,1543],{},"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,1546,1547],{},"createError",[427,1549,1550],{},"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,1553,1554],{},"log.set",[412,1556,1558],{"id":1557},"migrating-from","Migrating from",[395,1560,1561,1562,1565,1566,1569],{},"Pick the tab that matches your current logger. Each tab shows the ",[399,1563,1564],{},"before"," code in that library's own API. Underneath the tabs is the single ",[399,1567,1568],{},"after"," snippet — the same evlog code regardless of where you came from.",[1571,1572,1573,2010,2475,2787],"code-group",{},[1311,1574,1576],{"className":1313,"code":1575,"filename":401,"language":1315,"meta":1316,"style":1316},"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,1577,1578,1594,1598,1629,1665,1669,1698,1703,1712,1737,1803,1808,1839,1883,1888,1913,1948,1954,1968,1995,2004],{"__ignoreMap":1316},[1320,1579,1580,1582,1585,1588,1590,1592],{"class":1322,"line":1323},[1320,1581,1327],{"class":1326},[1320,1583,1584],{"class":1334}," pino ",[1320,1586,1587],{"class":1326},"from",[1320,1589,1344],{"class":1330},[1320,1591,401],{"class":1347},[1320,1593,1350],{"class":1330},[1320,1595,1596],{"class":1322,"line":1353},[1320,1597,1357],{"emptyLinePlaceholder":1356},[1320,1599,1600,1602,1604,1606,1609,1611,1613,1616,1618,1620,1623,1625,1627],{"class":1322,"line":1360},[1320,1601,1364],{"class":1363},[1320,1603,1367],{"class":1334},[1320,1605,1370],{"class":1330},[1320,1607,1608],{"class":1373}," pino",[1320,1610,1376],{"class":1334},[1320,1612,1379],{"class":1330},[1320,1614,1615],{"class":1382}," name",[1320,1617,1386],{"class":1330},[1320,1619,1344],{"class":1330},[1320,1621,1622],{"class":1347},"checkout",[1320,1624,1394],{"class":1330},[1320,1626,1338],{"class":1330},[1320,1628,1399],{"class":1334},[1320,1630,1631,1633,1636,1638,1641,1643,1646,1648,1650,1653,1655,1657,1659,1661,1663],{"class":1322,"line":1402},[1320,1632,1364],{"class":1363},[1320,1634,1635],{"class":1334}," child ",[1320,1637,1370],{"class":1330},[1320,1639,1640],{"class":1334}," log",[1320,1642,1408],{"class":1330},[1320,1644,1645],{"class":1373},"child",[1320,1647,1376],{"class":1334},[1320,1649,1379],{"class":1330},[1320,1651,1652],{"class":1382}," flow",[1320,1654,1386],{"class":1330},[1320,1656,1344],{"class":1330},[1320,1658,1622],{"class":1347},[1320,1660,1394],{"class":1330},[1320,1662,1338],{"class":1330},[1320,1664,1399],{"class":1334},[1320,1666,1667],{"class":1322,"line":1431},[1320,1668,1357],{"emptyLinePlaceholder":1356},[1320,1670,1672,1674,1676,1678,1680,1682,1685,1687,1689,1692,1694,1696],{"class":1322,"line":1671},6,[1320,1673,1645],{"class":1334},[1320,1675,1408],{"class":1330},[1320,1677,482],{"class":1373},[1320,1679,1376],{"class":1334},[1320,1681,1379],{"class":1330},[1320,1683,1684],{"class":1382}," event",[1320,1686,1386],{"class":1330},[1320,1688,1344],{"class":1330},[1320,1690,1691],{"class":1347},"checkout_started",[1320,1693,1394],{"class":1330},[1320,1695,1338],{"class":1330},[1320,1697,1399],{"class":1334},[1320,1699,1701],{"class":1322,"line":1700},7,[1320,1702,1357],{"emptyLinePlaceholder":1356},[1320,1704,1706,1709],{"class":1322,"line":1705},8,[1320,1707,1708],{"class":1326},"try",[1320,1710,1711],{"class":1330}," {\n",[1320,1713,1715,1718,1721,1724,1727,1730,1732,1735],{"class":1322,"line":1714},9,[1320,1716,1717],{"class":1363},"  const",[1320,1719,1720],{"class":1334}," cart",[1320,1722,1723],{"class":1330}," =",[1320,1725,1726],{"class":1326}," await",[1320,1728,1729],{"class":1373}," getCart",[1320,1731,1376],{"class":1382},[1320,1733,1734],{"class":1334},"userId",[1320,1736,1399],{"class":1382},[1320,1738,1740,1743,1745,1747,1749,1751,1753,1755,1757,1760,1762,1764,1766,1769,1771,1774,1777,1780,1782,1784,1786,1789,1791,1794,1796,1799,1801],{"class":1322,"line":1739},10,[1320,1741,1742],{"class":1334},"  child",[1320,1744,1408],{"class":1330},[1320,1746,482],{"class":1373},[1320,1748,1376],{"class":1382},[1320,1750,1379],{"class":1330},[1320,1752,1720],{"class":1382},[1320,1754,1386],{"class":1330},[1320,1756,1331],{"class":1330},[1320,1758,1759],{"class":1382}," items",[1320,1761,1386],{"class":1330},[1320,1763,1720],{"class":1334},[1320,1765,1408],{"class":1330},[1320,1767,1768],{"class":1334},"items",[1320,1770,1408],{"class":1330},[1320,1772,1773],{"class":1334},"length",[1320,1775,1776],{"class":1330},",",[1320,1778,1779],{"class":1382}," total",[1320,1781,1386],{"class":1330},[1320,1783,1720],{"class":1334},[1320,1785,1408],{"class":1330},[1320,1787,1788],{"class":1334},"total",[1320,1790,1338],{"class":1330},[1320,1792,1793],{"class":1330}," },",[1320,1795,1344],{"class":1330},[1320,1797,1798],{"class":1347},"cart loaded",[1320,1800,1394],{"class":1330},[1320,1802,1399],{"class":1382},[1320,1804,1806],{"class":1322,"line":1805},11,[1320,1807,1357],{"emptyLinePlaceholder":1356},[1320,1809,1811,1813,1816,1818,1820,1823,1825,1828,1830,1833,1835,1837],{"class":1322,"line":1810},12,[1320,1812,1717],{"class":1363},[1320,1814,1815],{"class":1334}," charge",[1320,1817,1723],{"class":1330},[1320,1819,1726],{"class":1326},[1320,1821,1822],{"class":1334}," stripe",[1320,1824,1408],{"class":1330},[1320,1826,1827],{"class":1373},"charge",[1320,1829,1376],{"class":1382},[1320,1831,1832],{"class":1334},"cart",[1320,1834,1408],{"class":1330},[1320,1836,1788],{"class":1334},[1320,1838,1399],{"class":1382},[1320,1840,1842,1844,1846,1848,1850,1852,1854,1856,1858,1861,1863,1865,1867,1870,1872,1874,1876,1879,1881],{"class":1322,"line":1841},13,[1320,1843,1742],{"class":1334},[1320,1845,1408],{"class":1330},[1320,1847,482],{"class":1373},[1320,1849,1376],{"class":1382},[1320,1851,1379],{"class":1330},[1320,1853,1822],{"class":1382},[1320,1855,1386],{"class":1330},[1320,1857,1331],{"class":1330},[1320,1859,1860],{"class":1382}," chargeId",[1320,1862,1386],{"class":1330},[1320,1864,1815],{"class":1334},[1320,1866,1408],{"class":1330},[1320,1868,1869],{"class":1334},"id",[1320,1871,1338],{"class":1330},[1320,1873,1793],{"class":1330},[1320,1875,1344],{"class":1330},[1320,1877,1878],{"class":1347},"charge ok",[1320,1880,1394],{"class":1330},[1320,1882,1399],{"class":1382},[1320,1884,1886],{"class":1322,"line":1885},14,[1320,1887,1357],{"emptyLinePlaceholder":1356},[1320,1889,1891,1894,1897,1900,1902,1904,1907,1910],{"class":1322,"line":1890},15,[1320,1892,1893],{"class":1326},"  if",[1320,1895,1896],{"class":1382}," (",[1320,1898,1899],{"class":1330},"!",[1320,1901,1827],{"class":1334},[1320,1903,1408],{"class":1330},[1320,1905,1906],{"class":1334},"success",[1320,1908,1909],{"class":1382},") ",[1320,1911,1912],{"class":1330},"{\n",[1320,1914,1916,1919,1922,1925,1927,1930,1933,1936,1938,1940,1943,1946],{"class":1322,"line":1915},16,[1320,1917,1918],{"class":1326},"    throw",[1320,1920,1921],{"class":1330}," new",[1320,1923,1924],{"class":1373}," Error",[1320,1926,1376],{"class":1382},[1320,1928,1929],{"class":1330},"`",[1320,1931,1932],{"class":1347},"Payment failed: ",[1320,1934,1935],{"class":1330},"${",[1320,1937,1827],{"class":1334},[1320,1939,1408],{"class":1330},[1320,1941,1942],{"class":1334},"decline_reason",[1320,1944,1945],{"class":1330},"}`",[1320,1947,1399],{"class":1382},[1320,1949,1951],{"class":1322,"line":1950},17,[1320,1952,1953],{"class":1330},"  }\n",[1320,1955,1957,1960,1963,1966],{"class":1322,"line":1956},18,[1320,1958,1959],{"class":1330},"}",[1320,1961,1962],{"class":1326}," catch",[1320,1964,1965],{"class":1334}," (err) ",[1320,1967,1912],{"class":1330},[1320,1969,1971,1973,1975,1977,1979,1981,1984,1986,1988,1991,1993],{"class":1322,"line":1970},19,[1320,1972,1742],{"class":1334},[1320,1974,1408],{"class":1330},[1320,1976,1500],{"class":1373},[1320,1978,1376],{"class":1382},[1320,1980,1379],{"class":1330},[1320,1982,1983],{"class":1334}," err",[1320,1985,1793],{"class":1330},[1320,1987,1344],{"class":1330},[1320,1989,1990],{"class":1347},"checkout failed",[1320,1992,1394],{"class":1330},[1320,1994,1399],{"class":1382},[1320,1996,1998,2001],{"class":1322,"line":1997},20,[1320,1999,2000],{"class":1326},"  throw",[1320,2002,2003],{"class":1334}," err\n",[1320,2005,2007],{"class":1322,"line":2006},21,[1320,2008,2009],{"class":1330},"}\n",[1311,2011,2013],{"className":1313,"code":2012,"filename":405,"language":1315,"meta":1316,"style":1316},"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,2014,2015,2049,2053,2067,2090,2130,2155,2161,2165,2203,2207,2213,2231,2294,2298,2324,2370,2374,2392,2418,2422,2432,2463,2470],{"__ignoreMap":1316},[1320,2016,2017,2019,2021,2023,2026,2029,2031,2034,2036,2039,2041,2043,2045,2047],{"class":1322,"line":1323},[1320,2018,1327],{"class":1326},[1320,2020,1331],{"class":1330},[1320,2022,1335],{"class":1334},[1320,2024,2025],{"class":1326}," as",[1320,2027,2028],{"class":1334}," createWinston",[1320,2030,1776],{"class":1330},[1320,2032,2033],{"class":1334}," format",[1320,2035,1776],{"class":1330},[1320,2037,2038],{"class":1334}," transports",[1320,2040,1338],{"class":1330},[1320,2042,1341],{"class":1326},[1320,2044,1344],{"class":1330},[1320,2046,405],{"class":1347},[1320,2048,1350],{"class":1330},[1320,2050,2051],{"class":1322,"line":1353},[1320,2052,1357],{"emptyLinePlaceholder":1356},[1320,2054,2055,2057,2059,2061,2063,2065],{"class":1322,"line":1360},[1320,2056,1364],{"class":1363},[1320,2058,1367],{"class":1334},[1320,2060,1370],{"class":1330},[1320,2062,2028],{"class":1373},[1320,2064,1376],{"class":1334},[1320,2066,1912],{"class":1330},[1320,2068,2069,2072,2074,2076,2079,2081,2083,2085,2087],{"class":1322,"line":1402},[1320,2070,2071],{"class":1382},"  defaultMeta",[1320,2073,1386],{"class":1330},[1320,2075,1331],{"class":1330},[1320,2077,2078],{"class":1382}," service",[1320,2080,1386],{"class":1330},[1320,2082,1344],{"class":1330},[1320,2084,1622],{"class":1347},[1320,2086,1394],{"class":1330},[1320,2088,2089],{"class":1330}," },\n",[1320,2091,2092,2095,2097,2099,2101,2104,2107,2109,2112,2115,2117,2119,2121,2124,2127],{"class":1322,"line":1431},[1320,2093,2094],{"class":1382},"  format",[1320,2096,1386],{"class":1330},[1320,2098,2033],{"class":1334},[1320,2100,1408],{"class":1330},[1320,2102,2103],{"class":1373},"combine",[1320,2105,2106],{"class":1334},"(format",[1320,2108,1408],{"class":1330},[1320,2110,2111],{"class":1373},"timestamp",[1320,2113,2114],{"class":1334},"()",[1320,2116,1776],{"class":1330},[1320,2118,2033],{"class":1334},[1320,2120,1408],{"class":1330},[1320,2122,2123],{"class":1373},"json",[1320,2125,2126],{"class":1334},"())",[1320,2128,2129],{"class":1330},",\n",[1320,2131,2132,2135,2137,2140,2143,2145,2147,2150,2153],{"class":1322,"line":1671},[1320,2133,2134],{"class":1382},"  transports",[1320,2136,1386],{"class":1330},[1320,2138,2139],{"class":1334}," [",[1320,2141,2142],{"class":1330},"new",[1320,2144,2038],{"class":1334},[1320,2146,1408],{"class":1330},[1320,2148,2149],{"class":1373},"Console",[1320,2151,2152],{"class":1334},"()]",[1320,2154,2129],{"class":1330},[1320,2156,2157,2159],{"class":1322,"line":1700},[1320,2158,1959],{"class":1330},[1320,2160,1399],{"class":1334},[1320,2162,2163],{"class":1322,"line":1705},[1320,2164,1357],{"emptyLinePlaceholder":1356},[1320,2166,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187,2189,2191,2193,2195,2197,2199,2201],{"class":1322,"line":1714},[1320,2168,1405],{"class":1334},[1320,2170,1408],{"class":1330},[1320,2172,482],{"class":1373},[1320,2174,1376],{"class":1334},[1320,2176,1379],{"class":1330},[1320,2178,1684],{"class":1382},[1320,2180,1386],{"class":1330},[1320,2182,1344],{"class":1330},[1320,2184,1691],{"class":1347},[1320,2186,1394],{"class":1330},[1320,2188,1776],{"class":1330},[1320,2190,1652],{"class":1382},[1320,2192,1386],{"class":1330},[1320,2194,1344],{"class":1330},[1320,2196,1622],{"class":1347},[1320,2198,1394],{"class":1330},[1320,2200,1338],{"class":1330},[1320,2202,1399],{"class":1334},[1320,2204,2205],{"class":1322,"line":1739},[1320,2206,1357],{"emptyLinePlaceholder":1356},[1320,2208,2209,2211],{"class":1322,"line":1805},[1320,2210,1708],{"class":1326},[1320,2212,1711],{"class":1330},[1320,2214,2215,2217,2219,2221,2223,2225,2227,2229],{"class":1322,"line":1810},[1320,2216,1717],{"class":1363},[1320,2218,1720],{"class":1334},[1320,2220,1723],{"class":1330},[1320,2222,1726],{"class":1326},[1320,2224,1729],{"class":1373},[1320,2226,1376],{"class":1382},[1320,2228,1734],{"class":1334},[1320,2230,1399],{"class":1382},[1320,2232,2233,2236,2238,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],{"class":1322,"line":1841},[1320,2234,2235],{"class":1334},"  log",[1320,2237,1408],{"class":1330},[1320,2239,482],{"class":1373},[1320,2241,1376],{"class":1382},[1320,2243,1379],{"class":1330},[1320,2245,1652],{"class":1382},[1320,2247,1386],{"class":1330},[1320,2249,1344],{"class":1330},[1320,2251,1622],{"class":1347},[1320,2253,1394],{"class":1330},[1320,2255,1776],{"class":1330},[1320,2257,1720],{"class":1382},[1320,2259,1386],{"class":1330},[1320,2261,1331],{"class":1330},[1320,2263,1759],{"class":1382},[1320,2265,1386],{"class":1330},[1320,2267,1720],{"class":1334},[1320,2269,1408],{"class":1330},[1320,2271,1768],{"class":1334},[1320,2273,1408],{"class":1330},[1320,2275,1773],{"class":1334},[1320,2277,1776],{"class":1330},[1320,2279,1779],{"class":1382},[1320,2281,1386],{"class":1330},[1320,2283,1720],{"class":1334},[1320,2285,1408],{"class":1330},[1320,2287,1788],{"class":1334},[1320,2289,1338],{"class":1330},[1320,2291,1338],{"class":1330},[1320,2293,1399],{"class":1382},[1320,2295,2296],{"class":1322,"line":1885},[1320,2297,1357],{"emptyLinePlaceholder":1356},[1320,2299,2300,2302,2304,2306,2308,2310,2312,2314,2316,2318,2320,2322],{"class":1322,"line":1890},[1320,2301,1717],{"class":1363},[1320,2303,1815],{"class":1334},[1320,2305,1723],{"class":1330},[1320,2307,1726],{"class":1326},[1320,2309,1822],{"class":1334},[1320,2311,1408],{"class":1330},[1320,2313,1827],{"class":1373},[1320,2315,1376],{"class":1382},[1320,2317,1832],{"class":1334},[1320,2319,1408],{"class":1330},[1320,2321,1788],{"class":1334},[1320,2323,1399],{"class":1382},[1320,2325,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368],{"class":1322,"line":1915},[1320,2327,2235],{"class":1334},[1320,2329,1408],{"class":1330},[1320,2331,482],{"class":1373},[1320,2333,1376],{"class":1382},[1320,2335,1379],{"class":1330},[1320,2337,1652],{"class":1382},[1320,2339,1386],{"class":1330},[1320,2341,1344],{"class":1330},[1320,2343,1622],{"class":1347},[1320,2345,1394],{"class":1330},[1320,2347,1776],{"class":1330},[1320,2349,1822],{"class":1382},[1320,2351,1386],{"class":1330},[1320,2353,1331],{"class":1330},[1320,2355,1860],{"class":1382},[1320,2357,1386],{"class":1330},[1320,2359,1815],{"class":1334},[1320,2361,1408],{"class":1330},[1320,2363,1869],{"class":1334},[1320,2365,1338],{"class":1330},[1320,2367,1338],{"class":1330},[1320,2369,1399],{"class":1382},[1320,2371,2372],{"class":1322,"line":1950},[1320,2373,1357],{"emptyLinePlaceholder":1356},[1320,2375,2376,2378,2380,2382,2384,2386,2388,2390],{"class":1322,"line":1956},[1320,2377,1893],{"class":1326},[1320,2379,1896],{"class":1382},[1320,2381,1899],{"class":1330},[1320,2383,1827],{"class":1334},[1320,2385,1408],{"class":1330},[1320,2387,1906],{"class":1334},[1320,2389,1909],{"class":1382},[1320,2391,1912],{"class":1330},[1320,2393,2394,2396,2398,2400,2402,2404,2406,2408,2410,2412,2414,2416],{"class":1322,"line":1970},[1320,2395,1918],{"class":1326},[1320,2397,1921],{"class":1330},[1320,2399,1924],{"class":1373},[1320,2401,1376],{"class":1382},[1320,2403,1929],{"class":1330},[1320,2405,1932],{"class":1347},[1320,2407,1935],{"class":1330},[1320,2409,1827],{"class":1334},[1320,2411,1408],{"class":1330},[1320,2413,1942],{"class":1334},[1320,2415,1945],{"class":1330},[1320,2417,1399],{"class":1382},[1320,2419,2420],{"class":1322,"line":1997},[1320,2421,1953],{"class":1330},[1320,2423,2424,2426,2428,2430],{"class":1322,"line":2006},[1320,2425,1959],{"class":1330},[1320,2427,1962],{"class":1326},[1320,2429,1965],{"class":1334},[1320,2431,1912],{"class":1330},[1320,2433,2435,2437,2439,2441,2443,2445,2447,2449,2451,2453,2455,2457,2459,2461],{"class":1322,"line":2434},22,[1320,2436,2235],{"class":1334},[1320,2438,1408],{"class":1330},[1320,2440,1500],{"class":1373},[1320,2442,1376],{"class":1382},[1320,2444,1379],{"class":1330},[1320,2446,1652],{"class":1382},[1320,2448,1386],{"class":1330},[1320,2450,1344],{"class":1330},[1320,2452,1622],{"class":1347},[1320,2454,1394],{"class":1330},[1320,2456,1776],{"class":1330},[1320,2458,1983],{"class":1334},[1320,2460,1338],{"class":1330},[1320,2462,1399],{"class":1382},[1320,2464,2466,2468],{"class":1322,"line":2465},23,[1320,2467,2000],{"class":1326},[1320,2469,2003],{"class":1334},[1320,2471,2473],{"class":1322,"line":2472},24,[1320,2474,2009],{"class":1330},[1311,2476,2478],{"className":1313,"code":2477,"filename":409,"language":1315,"meta":1316,"style":1316},"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,2479,2480,2499,2503,2528,2532,2551,2555,2561,2579,2629,2633,2659,2693,2697,2715,2741,2745,2755,2777,2783],{"__ignoreMap":1316},[1320,2481,2482,2484,2486,2489,2491,2493,2495,2497],{"class":1322,"line":1323},[1320,2483,1327],{"class":1326},[1320,2485,1331],{"class":1330},[1320,2487,2488],{"class":1334}," consola",[1320,2490,1338],{"class":1330},[1320,2492,1341],{"class":1326},[1320,2494,1344],{"class":1330},[1320,2496,409],{"class":1347},[1320,2498,1350],{"class":1330},[1320,2500,2501],{"class":1322,"line":1353},[1320,2502,1357],{"emptyLinePlaceholder":1356},[1320,2504,2505,2507,2509,2511,2513,2515,2518,2520,2522,2524,2526],{"class":1322,"line":1360},[1320,2506,1364],{"class":1363},[1320,2508,1367],{"class":1334},[1320,2510,1370],{"class":1330},[1320,2512,2488],{"class":1334},[1320,2514,1408],{"class":1330},[1320,2516,2517],{"class":1373},"withTag",[1320,2519,1376],{"class":1334},[1320,2521,1394],{"class":1330},[1320,2523,1622],{"class":1347},[1320,2525,1394],{"class":1330},[1320,2527,1399],{"class":1334},[1320,2529,2530],{"class":1322,"line":1402},[1320,2531,1357],{"emptyLinePlaceholder":1356},[1320,2533,2534,2536,2538,2540,2542,2544,2547,2549],{"class":1322,"line":1431},[1320,2535,1405],{"class":1334},[1320,2537,1408],{"class":1330},[1320,2539,482],{"class":1373},[1320,2541,1376],{"class":1334},[1320,2543,1394],{"class":1330},[1320,2545,2546],{"class":1347},"Starting checkout flow",[1320,2548,1394],{"class":1330},[1320,2550,1399],{"class":1334},[1320,2552,2553],{"class":1322,"line":1671},[1320,2554,1357],{"emptyLinePlaceholder":1356},[1320,2556,2557,2559],{"class":1322,"line":1700},[1320,2558,1708],{"class":1326},[1320,2560,1711],{"class":1330},[1320,2562,2563,2565,2567,2569,2571,2573,2575,2577],{"class":1322,"line":1705},[1320,2564,1717],{"class":1363},[1320,2566,1720],{"class":1334},[1320,2568,1723],{"class":1330},[1320,2570,1726],{"class":1326},[1320,2572,1729],{"class":1373},[1320,2574,1376],{"class":1382},[1320,2576,1734],{"class":1334},[1320,2578,1399],{"class":1382},[1320,2580,2581,2583,2585,2587,2589,2591,2593,2595,2597,2599,2601,2603,2605,2607,2609,2611,2613,2615,2617,2619,2621,2623,2625,2627],{"class":1322,"line":1714},[1320,2582,2235],{"class":1334},[1320,2584,1408],{"class":1330},[1320,2586,482],{"class":1373},[1320,2588,1376],{"class":1382},[1320,2590,1394],{"class":1330},[1320,2592,1798],{"class":1347},[1320,2594,1394],{"class":1330},[1320,2596,1776],{"class":1330},[1320,2598,1331],{"class":1330},[1320,2600,1759],{"class":1382},[1320,2602,1386],{"class":1330},[1320,2604,1720],{"class":1334},[1320,2606,1408],{"class":1330},[1320,2608,1768],{"class":1334},[1320,2610,1408],{"class":1330},[1320,2612,1773],{"class":1334},[1320,2614,1776],{"class":1330},[1320,2616,1779],{"class":1382},[1320,2618,1386],{"class":1330},[1320,2620,1720],{"class":1334},[1320,2622,1408],{"class":1330},[1320,2624,1788],{"class":1334},[1320,2626,1338],{"class":1330},[1320,2628,1399],{"class":1382},[1320,2630,2631],{"class":1322,"line":1739},[1320,2632,1357],{"emptyLinePlaceholder":1356},[1320,2634,2635,2637,2639,2641,2643,2645,2647,2649,2651,2653,2655,2657],{"class":1322,"line":1805},[1320,2636,1717],{"class":1363},[1320,2638,1815],{"class":1334},[1320,2640,1723],{"class":1330},[1320,2642,1726],{"class":1326},[1320,2644,1822],{"class":1334},[1320,2646,1408],{"class":1330},[1320,2648,1827],{"class":1373},[1320,2650,1376],{"class":1382},[1320,2652,1832],{"class":1334},[1320,2654,1408],{"class":1330},[1320,2656,1788],{"class":1334},[1320,2658,1399],{"class":1382},[1320,2660,2661,2663,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689,2691],{"class":1322,"line":1810},[1320,2662,2235],{"class":1334},[1320,2664,1408],{"class":1330},[1320,2666,482],{"class":1373},[1320,2668,1376],{"class":1382},[1320,2670,1394],{"class":1330},[1320,2672,1878],{"class":1347},[1320,2674,1394],{"class":1330},[1320,2676,1776],{"class":1330},[1320,2678,1331],{"class":1330},[1320,2680,1860],{"class":1382},[1320,2682,1386],{"class":1330},[1320,2684,1815],{"class":1334},[1320,2686,1408],{"class":1330},[1320,2688,1869],{"class":1334},[1320,2690,1338],{"class":1330},[1320,2692,1399],{"class":1382},[1320,2694,2695],{"class":1322,"line":1841},[1320,2696,1357],{"emptyLinePlaceholder":1356},[1320,2698,2699,2701,2703,2705,2707,2709,2711,2713],{"class":1322,"line":1885},[1320,2700,1893],{"class":1326},[1320,2702,1896],{"class":1382},[1320,2704,1899],{"class":1330},[1320,2706,1827],{"class":1334},[1320,2708,1408],{"class":1330},[1320,2710,1906],{"class":1334},[1320,2712,1909],{"class":1382},[1320,2714,1912],{"class":1330},[1320,2716,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735,2737,2739],{"class":1322,"line":1890},[1320,2718,1918],{"class":1326},[1320,2720,1921],{"class":1330},[1320,2722,1924],{"class":1373},[1320,2724,1376],{"class":1382},[1320,2726,1929],{"class":1330},[1320,2728,1932],{"class":1347},[1320,2730,1935],{"class":1330},[1320,2732,1827],{"class":1334},[1320,2734,1408],{"class":1330},[1320,2736,1942],{"class":1334},[1320,2738,1945],{"class":1330},[1320,2740,1399],{"class":1382},[1320,2742,2743],{"class":1322,"line":1915},[1320,2744,1953],{"class":1330},[1320,2746,2747,2749,2751,2753],{"class":1322,"line":1950},[1320,2748,1959],{"class":1330},[1320,2750,1962],{"class":1326},[1320,2752,1965],{"class":1334},[1320,2754,1912],{"class":1330},[1320,2756,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775],{"class":1322,"line":1956},[1320,2758,2235],{"class":1334},[1320,2760,1408],{"class":1330},[1320,2762,1500],{"class":1373},[1320,2764,1376],{"class":1382},[1320,2766,1394],{"class":1330},[1320,2768,1990],{"class":1347},[1320,2770,1394],{"class":1330},[1320,2772,1776],{"class":1330},[1320,2774,1983],{"class":1334},[1320,2776,1399],{"class":1382},[1320,2778,2779,2781],{"class":1322,"line":1970},[1320,2780,2000],{"class":1326},[1320,2782,2003],{"class":1334},[1320,2784,2785],{"class":1322,"line":1997},[1320,2786,2009],{"class":1330},[1311,2788,2791],{"className":1313,"code":2789,"filename":2790,"language":1315,"meta":1316,"style":1316},"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,2792,2793,2813,2817,2823,2841,2893,2897,2923,2958,2962,2980,3006,3010,3020,3043,3049],{"__ignoreMap":1316},[1320,2794,2795,2798,2800,2802,2804,2806,2809,2811],{"class":1322,"line":1323},[1320,2796,2797],{"class":1334},"console",[1320,2799,1408],{"class":1330},[1320,2801,1405],{"class":1373},[1320,2803,1376],{"class":1334},[1320,2805,1394],{"class":1330},[1320,2807,2808],{"class":1347},"[checkout] Starting checkout flow",[1320,2810,1394],{"class":1330},[1320,2812,1399],{"class":1334},[1320,2814,2815],{"class":1322,"line":1353},[1320,2816,1357],{"emptyLinePlaceholder":1356},[1320,2818,2819,2821],{"class":1322,"line":1360},[1320,2820,1708],{"class":1326},[1320,2822,1711],{"class":1330},[1320,2824,2825,2827,2829,2831,2833,2835,2837,2839],{"class":1322,"line":1402},[1320,2826,1717],{"class":1363},[1320,2828,1720],{"class":1334},[1320,2830,1723],{"class":1330},[1320,2832,1726],{"class":1326},[1320,2834,1729],{"class":1373},[1320,2836,1376],{"class":1382},[1320,2838,1734],{"class":1334},[1320,2840,1399],{"class":1382},[1320,2842,2843,2846,2848,2850,2852,2854,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877,2879,2881,2883,2885,2887,2889,2891],{"class":1322,"line":1431},[1320,2844,2845],{"class":1334},"  console",[1320,2847,1408],{"class":1330},[1320,2849,1405],{"class":1373},[1320,2851,1376],{"class":1382},[1320,2853,1394],{"class":1330},[1320,2855,2856],{"class":1347},"[checkout] cart loaded",[1320,2858,1394],{"class":1330},[1320,2860,1776],{"class":1330},[1320,2862,1331],{"class":1330},[1320,2864,1759],{"class":1382},[1320,2866,1386],{"class":1330},[1320,2868,1720],{"class":1334},[1320,2870,1408],{"class":1330},[1320,2872,1768],{"class":1334},[1320,2874,1408],{"class":1330},[1320,2876,1773],{"class":1334},[1320,2878,1776],{"class":1330},[1320,2880,1779],{"class":1382},[1320,2882,1386],{"class":1330},[1320,2884,1720],{"class":1334},[1320,2886,1408],{"class":1330},[1320,2888,1788],{"class":1334},[1320,2890,1338],{"class":1330},[1320,2892,1399],{"class":1382},[1320,2894,2895],{"class":1322,"line":1671},[1320,2896,1357],{"emptyLinePlaceholder":1356},[1320,2898,2899,2901,2903,2905,2907,2909,2911,2913,2915,2917,2919,2921],{"class":1322,"line":1700},[1320,2900,1717],{"class":1363},[1320,2902,1815],{"class":1334},[1320,2904,1723],{"class":1330},[1320,2906,1726],{"class":1326},[1320,2908,1822],{"class":1334},[1320,2910,1408],{"class":1330},[1320,2912,1827],{"class":1373},[1320,2914,1376],{"class":1382},[1320,2916,1832],{"class":1334},[1320,2918,1408],{"class":1330},[1320,2920,1788],{"class":1334},[1320,2922,1399],{"class":1382},[1320,2924,2925,2927,2929,2931,2933,2935,2938,2940,2942,2944,2946,2948,2950,2952,2954,2956],{"class":1322,"line":1705},[1320,2926,2845],{"class":1334},[1320,2928,1408],{"class":1330},[1320,2930,1405],{"class":1373},[1320,2932,1376],{"class":1382},[1320,2934,1394],{"class":1330},[1320,2936,2937],{"class":1347},"[checkout] charge ok",[1320,2939,1394],{"class":1330},[1320,2941,1776],{"class":1330},[1320,2943,1331],{"class":1330},[1320,2945,1860],{"class":1382},[1320,2947,1386],{"class":1330},[1320,2949,1815],{"class":1334},[1320,2951,1408],{"class":1330},[1320,2953,1869],{"class":1334},[1320,2955,1338],{"class":1330},[1320,2957,1399],{"class":1382},[1320,2959,2960],{"class":1322,"line":1714},[1320,2961,1357],{"emptyLinePlaceholder":1356},[1320,2963,2964,2966,2968,2970,2972,2974,2976,2978],{"class":1322,"line":1739},[1320,2965,1893],{"class":1326},[1320,2967,1896],{"class":1382},[1320,2969,1899],{"class":1330},[1320,2971,1827],{"class":1334},[1320,2973,1408],{"class":1330},[1320,2975,1906],{"class":1334},[1320,2977,1909],{"class":1382},[1320,2979,1912],{"class":1330},[1320,2981,2982,2984,2986,2988,2990,2992,2994,2996,2998,3000,3002,3004],{"class":1322,"line":1805},[1320,2983,1918],{"class":1326},[1320,2985,1921],{"class":1330},[1320,2987,1924],{"class":1373},[1320,2989,1376],{"class":1382},[1320,2991,1929],{"class":1330},[1320,2993,1932],{"class":1347},[1320,2995,1935],{"class":1330},[1320,2997,1827],{"class":1334},[1320,2999,1408],{"class":1330},[1320,3001,1942],{"class":1334},[1320,3003,1945],{"class":1330},[1320,3005,1399],{"class":1382},[1320,3007,3008],{"class":1322,"line":1810},[1320,3009,1953],{"class":1330},[1320,3011,3012,3014,3016,3018],{"class":1322,"line":1841},[1320,3013,1959],{"class":1330},[1320,3015,1962],{"class":1326},[1320,3017,1965],{"class":1334},[1320,3019,1912],{"class":1330},[1320,3021,3022,3024,3026,3028,3030,3032,3035,3037,3039,3041],{"class":1322,"line":1885},[1320,3023,2845],{"class":1334},[1320,3025,1408],{"class":1330},[1320,3027,1500],{"class":1373},[1320,3029,1376],{"class":1382},[1320,3031,1394],{"class":1330},[1320,3033,3034],{"class":1347},"[checkout] failed",[1320,3036,1394],{"class":1330},[1320,3038,1776],{"class":1330},[1320,3040,1983],{"class":1334},[1320,3042,1399],{"class":1382},[1320,3044,3045,3047],{"class":1322,"line":1890},[1320,3046,2000],{"class":1326},[1320,3048,2003],{"class":1334},[1320,3050,3051],{"class":1322,"line":1915},[1320,3052,2009],{"class":1330},[395,3054,3055],{},"All four become this — same code regardless of the source library:",[1311,3057,3060],{"className":1313,"code":3058,"filename":3059,"language":1315,"meta":1316,"style":1316},"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,3061,3062,3090,3094,3125,3129,3157,3161,3167,3185,3235,3239,3265,3299,3303,3321,3331,3347,3359,3374,3390,3397,3401,3411,3431,3437,3447,3458],{"__ignoreMap":1316},[1320,3063,3064,3066,3068,3071,3073,3075,3077,3080,3082,3084,3086,3088],{"class":1322,"line":1323},[1320,3065,1327],{"class":1326},[1320,3067,1331],{"class":1330},[1320,3069,3070],{"class":1334}," initLogger",[1320,3072,1776],{"class":1330},[1320,3074,1335],{"class":1334},[1320,3076,1776],{"class":1330},[1320,3078,3079],{"class":1334}," createError",[1320,3081,1338],{"class":1330},[1320,3083,1341],{"class":1326},[1320,3085,1344],{"class":1330},[1320,3087,509],{"class":1347},[1320,3089,1350],{"class":1330},[1320,3091,3092],{"class":1322,"line":1353},[1320,3093,1357],{"emptyLinePlaceholder":1356},[1320,3095,3096,3098,3100,3102,3105,3107,3109,3111,3113,3115,3117,3119,3121,3123],{"class":1322,"line":1360},[1320,3097,1480],{"class":1373},[1320,3099,1376],{"class":1334},[1320,3101,1379],{"class":1330},[1320,3103,3104],{"class":1382}," env",[1320,3106,1386],{"class":1330},[1320,3108,1331],{"class":1330},[1320,3110,2078],{"class":1382},[1320,3112,1386],{"class":1330},[1320,3114,1344],{"class":1330},[1320,3116,1622],{"class":1347},[1320,3118,1394],{"class":1330},[1320,3120,1338],{"class":1330},[1320,3122,1338],{"class":1330},[1320,3124,1399],{"class":1334},[1320,3126,3127],{"class":1322,"line":1402},[1320,3128,1357],{"emptyLinePlaceholder":1356},[1320,3130,3131,3133,3135,3137,3139,3141,3143,3145,3147,3149,3151,3153,3155],{"class":1322,"line":1431},[1320,3132,1364],{"class":1363},[1320,3134,1367],{"class":1334},[1320,3136,1370],{"class":1330},[1320,3138,1335],{"class":1373},[1320,3140,1376],{"class":1334},[1320,3142,1379],{"class":1330},[1320,3144,1652],{"class":1382},[1320,3146,1386],{"class":1330},[1320,3148,1344],{"class":1330},[1320,3150,1622],{"class":1347},[1320,3152,1394],{"class":1330},[1320,3154,1338],{"class":1330},[1320,3156,1399],{"class":1334},[1320,3158,3159],{"class":1322,"line":1671},[1320,3160,1357],{"emptyLinePlaceholder":1356},[1320,3162,3163,3165],{"class":1322,"line":1700},[1320,3164,1708],{"class":1326},[1320,3166,1711],{"class":1330},[1320,3168,3169,3171,3173,3175,3177,3179,3181,3183],{"class":1322,"line":1705},[1320,3170,1717],{"class":1363},[1320,3172,1720],{"class":1334},[1320,3174,1723],{"class":1330},[1320,3176,1726],{"class":1326},[1320,3178,1729],{"class":1373},[1320,3180,1376],{"class":1382},[1320,3182,1734],{"class":1334},[1320,3184,1399],{"class":1382},[1320,3186,3187,3189,3191,3193,3195,3197,3199,3201,3203,3205,3207,3209,3211,3213,3215,3217,3219,3221,3223,3225,3227,3229,3231,3233],{"class":1322,"line":1714},[1320,3188,2235],{"class":1334},[1320,3190,1408],{"class":1330},[1320,3192,1411],{"class":1373},[1320,3194,1376],{"class":1382},[1320,3196,1379],{"class":1330},[1320,3198,1720],{"class":1382},[1320,3200,1386],{"class":1330},[1320,3202,1331],{"class":1330},[1320,3204,1759],{"class":1382},[1320,3206,1386],{"class":1330},[1320,3208,1720],{"class":1334},[1320,3210,1408],{"class":1330},[1320,3212,1768],{"class":1334},[1320,3214,1408],{"class":1330},[1320,3216,1773],{"class":1334},[1320,3218,1776],{"class":1330},[1320,3220,1779],{"class":1382},[1320,3222,1386],{"class":1330},[1320,3224,1720],{"class":1334},[1320,3226,1408],{"class":1330},[1320,3228,1788],{"class":1334},[1320,3230,1338],{"class":1330},[1320,3232,1338],{"class":1330},[1320,3234,1399],{"class":1382},[1320,3236,3237],{"class":1322,"line":1739},[1320,3238,1357],{"emptyLinePlaceholder":1356},[1320,3240,3241,3243,3245,3247,3249,3251,3253,3255,3257,3259,3261,3263],{"class":1322,"line":1805},[1320,3242,1717],{"class":1363},[1320,3244,1815],{"class":1334},[1320,3246,1723],{"class":1330},[1320,3248,1726],{"class":1326},[1320,3250,1822],{"class":1334},[1320,3252,1408],{"class":1330},[1320,3254,1827],{"class":1373},[1320,3256,1376],{"class":1382},[1320,3258,1832],{"class":1334},[1320,3260,1408],{"class":1330},[1320,3262,1788],{"class":1334},[1320,3264,1399],{"class":1382},[1320,3266,3267,3269,3271,3273,3275,3277,3279,3281,3283,3285,3287,3289,3291,3293,3295,3297],{"class":1322,"line":1810},[1320,3268,2235],{"class":1334},[1320,3270,1408],{"class":1330},[1320,3272,1411],{"class":1373},[1320,3274,1376],{"class":1382},[1320,3276,1379],{"class":1330},[1320,3278,1822],{"class":1382},[1320,3280,1386],{"class":1330},[1320,3282,1331],{"class":1330},[1320,3284,1860],{"class":1382},[1320,3286,1386],{"class":1330},[1320,3288,1815],{"class":1334},[1320,3290,1408],{"class":1330},[1320,3292,1869],{"class":1334},[1320,3294,1338],{"class":1330},[1320,3296,1338],{"class":1330},[1320,3298,1399],{"class":1382},[1320,3300,3301],{"class":1322,"line":1841},[1320,3302,1357],{"emptyLinePlaceholder":1356},[1320,3304,3305,3307,3309,3311,3313,3315,3317,3319],{"class":1322,"line":1885},[1320,3306,1893],{"class":1326},[1320,3308,1896],{"class":1382},[1320,3310,1899],{"class":1330},[1320,3312,1827],{"class":1334},[1320,3314,1408],{"class":1330},[1320,3316,1906],{"class":1334},[1320,3318,1909],{"class":1382},[1320,3320,1912],{"class":1330},[1320,3322,3323,3325,3327,3329],{"class":1322,"line":1890},[1320,3324,1918],{"class":1326},[1320,3326,3079],{"class":1373},[1320,3328,1376],{"class":1382},[1320,3330,1912],{"class":1330},[1320,3332,3333,3336,3338,3340,3343,3345],{"class":1322,"line":1915},[1320,3334,3335],{"class":1382},"      message",[1320,3337,1386],{"class":1330},[1320,3339,1344],{"class":1330},[1320,3341,3342],{"class":1347},"Payment failed",[1320,3344,1394],{"class":1330},[1320,3346,2129],{"class":1330},[1320,3348,3349,3352,3354,3357],{"class":1322,"line":1950},[1320,3350,3351],{"class":1382},"      status",[1320,3353,1386],{"class":1330},[1320,3355,3356],{"class":1423}," 402",[1320,3358,2129],{"class":1330},[1320,3360,3361,3364,3366,3368,3370,3372],{"class":1322,"line":1956},[1320,3362,3363],{"class":1382},"      why",[1320,3365,1386],{"class":1330},[1320,3367,1815],{"class":1334},[1320,3369,1408],{"class":1330},[1320,3371,1942],{"class":1334},[1320,3373,2129],{"class":1330},[1320,3375,3376,3379,3381,3383,3386,3388],{"class":1322,"line":1970},[1320,3377,3378],{"class":1382},"      fix",[1320,3380,1386],{"class":1330},[1320,3382,1344],{"class":1330},[1320,3384,3385],{"class":1347},"Try a different payment method",[1320,3387,1394],{"class":1330},[1320,3389,2129],{"class":1330},[1320,3391,3392,3395],{"class":1322,"line":1997},[1320,3393,3394],{"class":1330},"    }",[1320,3396,1399],{"class":1382},[1320,3398,3399],{"class":1322,"line":2006},[1320,3400,1953],{"class":1330},[1320,3402,3403,3405,3407,3409],{"class":1322,"line":2434},[1320,3404,1959],{"class":1330},[1320,3406,1962],{"class":1326},[1320,3408,1965],{"class":1334},[1320,3410,1912],{"class":1330},[1320,3412,3413,3415,3417,3419,3421,3424,3426,3429],{"class":1322,"line":2465},[1320,3414,2235],{"class":1334},[1320,3416,1408],{"class":1330},[1320,3418,1500],{"class":1373},[1320,3420,1376],{"class":1382},[1320,3422,3423],{"class":1334},"err",[1320,3425,2025],{"class":1326},[1320,3427,1924],{"class":3428},"sBMFI",[1320,3430,1399],{"class":1382},[1320,3432,3433,3435],{"class":1322,"line":2472},[1320,3434,2000],{"class":1326},[1320,3436,2003],{"class":1334},[1320,3438,3440,3442,3445],{"class":1322,"line":3439},25,[1320,3441,1959],{"class":1330},[1320,3443,3444],{"class":1326}," finally",[1320,3446,1711],{"class":1330},[1320,3448,3450,3452,3454,3456],{"class":1322,"line":3449},26,[1320,3451,2235],{"class":1334},[1320,3453,1408],{"class":1330},[1320,3455,1438],{"class":1373},[1320,3457,1441],{"class":1382},[1320,3459,3461],{"class":1322,"line":3460},27,[1320,3462,2009],{"class":1330},[395,3464,3465],{},"Three things changed in every migration:",[417,3467,3468,3481,3501],{},[420,3469,3470,3473,3474,3476,3477,3480],{},[399,3471,3472],{},"N log lines → 1 wide event."," The 3-4 calls per request become ",[427,3475,1554],{}," accumulations and one ",[427,3478,3479],{},"log.emit"," at the end. Your dashboard gets one queryable row instead of stitching by request id.",[420,3482,3483,3493,3494,3496,3497,3500],{},[399,3484,3485,3486,3489,3490,1408],{},"Errors carry ",[427,3487,3488],{},"why"," and ",[427,3491,3492],{},"fix"," Throwing ",[427,3495,1547],{}," instead of ",[427,3498,3499],{},"new Error"," means your client (and on-call) get actionable context, not just a stack.",[420,3502,3503,3506,3507,3509,3510,3512],{},[399,3504,3505],{},"Setup is one line."," No formatter wiring, no transport assembly, no ",[427,3508,432],{}," peer dep. ",[427,3511,1480],{}," once at boot and you're done.",[412,3514,3516],{"id":3515},"reverse-direction-when-not-to-pick-evlog","Reverse direction: when not to pick evlog",[395,3518,3519],{},"Be honest with yourself. Don't switch if:",[417,3521,3522,3533,3540],{},[420,3523,3524,3525,402,3527,402,3529,3532],{},"You ship a library that's already part of the pino ecosystem (",[427,3526,435],{},[427,3528,432],{},[427,3530,3531],{},"pino-multi-stream"," plugins) and would lose tooling.",[420,3534,3535,3536,3539],{},"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,3537,3538],{"href":291},"built-in adapters"," cover the common destinations, but custom protocols mean a port.",[420,3541,3542],{},"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,3544,3546],{"id":3545},"next-steps","Next Steps",[417,3548,3549,3557,3562,3568],{},[420,3550,3551,3553,3554,3556],{},[444,3552,46],{"href":47}," — the ",[427,3555,1299],{}," API, migration tabs, and patterns",[420,3558,3559,3561],{},[444,3560,51],{"href":52}," — what unlocks when you accumulate context per operation",[420,3563,3564,3567],{},[444,3565,3566],{"href":185},"Performance Benchmarks"," — the methodology behind the numbers above",[420,3569,3570,3573],{},[444,3571,3572],{"href":268},"Standalone TypeScript"," — scripts, workers, and libraries without a web framework",[3575,3576,3577],"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":1316,"searchDepth":1353,"depth":1353,"links":3579},[3580,3581,3586,3596,3597,3598],{"id":414,"depth":1353,"text":415},{"id":470,"depth":1353,"text":471,"children":3582},[3583,3584,3585],{"id":491,"depth":1360,"text":492},{"id":772,"depth":1360,"text":773},{"id":1059,"depth":1360,"text":1060},{"id":1288,"depth":1353,"text":1289,"children":3587},[3588,3590,3592,3593,3595],{"id":1295,"depth":1360,"text":3589},"No persistent-bindings shorthand on log.*",{"id":1455,"depth":1360,"text":3591},"minLevel is set once at startup",{"id":1484,"depth":1360,"text":1485},{"id":1520,"depth":1360,"text":3594},"No multi-stream \u002F transport array on log.*",{"id":1537,"depth":1360,"text":1538},{"id":1557,"depth":1353,"text":1558},{"id":3515,"depth":1353,"text":3516},{"id":3545,"depth":1353,"text":3546},"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",[3602,3605],{"label":3566,"icon":121,"to":185,"color":3603,"variant":3604},"neutral","subtle",{"label":46,"icon":49,"to":47,"color":3603,"variant":3604},{},{"title":30,"icon":33},{"title":390,"description":3599},"GAaHYaP5N6jSq886Fjp5xhUed9i6rswet1Rjt6n1T04",[3611,3613],{"title":25,"path":26,"stem":27,"description":3612,"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":3614,"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.",1777982705982]