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