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