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