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