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