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