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