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